Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/preemption.cfa

    r7222630 rbfcf6b9  
    354354}
    355355
    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 
    390356#undef __cfaasm_label
    391 
    392 //-----------------------------------------------------------------------------
    393 // Signal handling
    394357
    395358// sigprocmask wrapper : unblock a single signal
     
    424387static void timeout( $thread * this ) {
    425388        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"); }
    460389}
    461390
     
    550479        __cfaasm_label( check  );
    551480        __cfaasm_label( dsable );
    552         __cfaasm_label( debug  );
    553481
    554482        // Check if preemption is safe
     
    557485        if( __cfaasm_in( ip, check  ) ) { ready = false; goto EXIT; };
    558486        if( __cfaasm_in( ip, dsable ) ) { ready = false; goto EXIT; };
    559         if( __cfaasm_in( ip, debug  ) ) { ready = false; goto EXIT; };
    560487        if( !__cfaabi_tls.preemption_state.enabled) { ready = false; goto EXIT; };
    561488        if( __cfaabi_tls.preemption_state.in_progress ) { ready = false; goto EXIT; };
     
    769696}
    770697
     698//=============================================================================================
     699// Kernel Signal Debug
     700//=============================================================================================
     701
     702void __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__
     725bool __cfaabi_dbg_in_kernel() {
     726        return !__preemption_enabled();
     727}
     728#endif
     729
    771730// Local Variables: //
    772731// mode: c //
Note: See TracChangeset for help on using the changeset viewer.