- File:
-
- 1 edited
-
libcfa/src/concurrency/preemption.cfa (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/preemption.cfa
r7222630 rbfcf6b9 354 354 } 355 355 356 //-----------------------------------------------------------------------------357 // Kernel Signal Debug358 void __cfaabi_check_preemption() {359 bool ready = __preemption_enabled();360 if(!ready) { abort("Preemption should be ready"); }361 362 __cfaasm_label(debug, before);363 364 sigset_t oldset;365 int ret;366 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary367 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }368 369 ret = sigismember(&oldset, SIGUSR1);370 if(ret < 0) { abort("ERROR sigismember returned %d", ret); }371 if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }372 373 ret = sigismember(&oldset, SIGALRM);374 if(ret < 0) { abort("ERROR sigismember returned %d", ret); }375 if(ret == 0) { abort("ERROR SIGALRM is enabled"); }376 377 ret = sigismember(&oldset, SIGTERM);378 if(ret < 0) { abort("ERROR sigismember returned %d", ret); }379 if(ret == 1) { abort("ERROR SIGTERM is disabled"); }380 381 __cfaasm_label(debug, after);382 }383 384 #ifdef __CFA_WITH_VERIFY__385 bool __cfaabi_dbg_in_kernel() {386 return !__preemption_enabled();387 }388 #endif389 390 356 #undef __cfaasm_label 391 392 //-----------------------------------------------------------------------------393 // Signal handling394 357 395 358 // sigprocmask wrapper : unblock a single signal … … 424 387 static void timeout( $thread * this ) { 425 388 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 unnecessary432 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 unnecessary451 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"); }460 389 } 461 390 … … 550 479 __cfaasm_label( check ); 551 480 __cfaasm_label( dsable ); 552 __cfaasm_label( debug );553 481 554 482 // Check if preemption is safe … … 557 485 if( __cfaasm_in( ip, check ) ) { ready = false; goto EXIT; }; 558 486 if( __cfaasm_in( ip, dsable ) ) { ready = false; goto EXIT; }; 559 if( __cfaasm_in( ip, debug ) ) { ready = false; goto EXIT; };560 487 if( !__cfaabi_tls.preemption_state.enabled) { ready = false; goto EXIT; }; 561 488 if( __cfaabi_tls.preemption_state.in_progress ) { ready = false; goto EXIT; }; … … 769 696 } 770 697 698 //============================================================================================= 699 // Kernel Signal Debug 700 //============================================================================================= 701 702 void __cfaabi_check_preemption() { 703 bool ready = __preemption_enabled(); 704 if(!ready) { abort("Preemption should be ready"); } 705 706 sigset_t oldset; 707 int ret; 708 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary 709 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 710 711 ret = sigismember(&oldset, SIGUSR1); 712 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 713 if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); } 714 715 ret = sigismember(&oldset, SIGALRM); 716 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 717 if(ret == 0) { abort("ERROR SIGALRM is enabled"); } 718 719 ret = sigismember(&oldset, SIGTERM); 720 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 721 if(ret == 1) { abort("ERROR SIGTERM is disabled"); } 722 } 723 724 #ifdef __CFA_WITH_VERIFY__ 725 bool __cfaabi_dbg_in_kernel() { 726 return !__preemption_enabled(); 727 } 728 #endif 729 771 730 // Local Variables: // 772 731 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.