- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/preemption.cfa
rbfcf6b9 r7222630 354 354 } 355 355 356 //----------------------------------------------------------------------------- 357 // Kernel Signal Debug 358 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 unnecessary 367 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 #endif 389 356 390 #undef __cfaasm_label 391 392 //----------------------------------------------------------------------------- 393 // Signal handling 357 394 358 395 // sigprocmask wrapper : unblock a single signal … … 387 424 static void timeout( $thread * this ) { 388 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"); } 389 460 } 390 461 … … 479 550 __cfaasm_label( check ); 480 551 __cfaasm_label( dsable ); 552 __cfaasm_label( debug ); 481 553 482 554 // Check if preemption is safe … … 485 557 if( __cfaasm_in( ip, check ) ) { ready = false; goto EXIT; }; 486 558 if( __cfaasm_in( ip, dsable ) ) { ready = false; goto EXIT; }; 559 if( __cfaasm_in( ip, debug ) ) { ready = false; goto EXIT; }; 487 560 if( !__cfaabi_tls.preemption_state.enabled) { ready = false; goto EXIT; }; 488 561 if( __cfaabi_tls.preemption_state.in_progress ) { ready = false; goto EXIT; }; … … 696 769 } 697 770 698 //=============================================================================================699 // Kernel Signal Debug700 //=============================================================================================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 unnecessary709 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 #endif729 730 771 // Local Variables: // 731 772 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.