Changeset 7222630
- Timestamp:
- Jan 14, 2021, 1:13:47 PM (3 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 03ecdcf, 54cc2bf, ee59ede
- Parents:
- b0f6190a
- Location:
- libcfa/src/concurrency
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/io/setup.cfa
rb0f6190a r7222630 314 314 } 315 315 316 extern void signal_block( int sig);317 extern void signal_unblock( int sig);316 extern void __disable_interrupts_hard(); 317 extern void __enable_interrupts_hard(); 318 318 319 319 static void __io_create( __io_data & this, const io_context_params & params_in ) { … … 434 434 // io_uring_register is so f*cking slow on some machine that it 435 435 // will never succeed if preemption isn't hard blocked 436 signal_block( SIGUSR1);436 __disable_interrupts_hard(); 437 437 438 438 int efd = eventfd(0, 0); … … 446 446 } 447 447 448 signal_unblock( SIGUSR1);448 __enable_interrupts_hard(); 449 449 450 450 // some paranoid checks -
libcfa/src/concurrency/preemption.cfa
rb0f6190a r7222630 394 394 395 395 // sigprocmask wrapper : unblock a single signal 396 void signal_unblock( int sig ) {396 static inline void signal_unblock( int sig ) { 397 397 sigset_t mask; 398 398 sigemptyset( &mask ); … … 405 405 406 406 // sigprocmask wrapper : block a single signal 407 void signal_block( int sig ) {407 static inline void signal_block( int sig ) { 408 408 sigset_t mask; 409 409 sigemptyset( &mask ); … … 424 424 static void timeout( $thread * this ) { 425 425 unpark( this ); 426 } 427 428 void __disable_interrupts_hard() { 429 sigset_t oldset; 430 int ret; 431 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary 432 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 433 434 ret = sigismember(&oldset, SIGUSR1); 435 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 436 if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); } 437 438 ret = sigismember(&oldset, SIGALRM); 439 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 440 if(ret == 0) { abort("ERROR SIGALRM is enabled"); } 441 442 signal_block( SIGUSR1 ); 443 } 444 445 void __enable_interrupts_hard() { 446 signal_unblock( SIGUSR1 ); 447 448 sigset_t oldset; 449 int ret; 450 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary 451 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 452 453 ret = sigismember(&oldset, SIGUSR1); 454 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 455 if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); } 456 457 ret = sigismember(&oldset, SIGALRM); 458 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 459 if(ret == 0) { abort("ERROR SIGALRM is enabled"); } 426 460 } 427 461
Note: See TracChangeset
for help on using the changeset viewer.