Ignore:
File:
1 edited

Legend:

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

    r14a61b5 rb68fc85  
    234234}
    235235
    236 // KERNEL ONLY
     236
    237237// Check if a CtxSwitch signal handler shoud defer
    238238// If true  : preemption is safe
    239239// If false : preemption is unsafe and marked as pending
    240240static inline bool preemption_ready() {
    241         // Check if preemption is safe
    242         bool ready = kernelTLS.preemption_state.enabled && ! kernelTLS.preemption_state.in_progress;
    243 
    244         // Adjust the pending flag accordingly
    245         kernelTLS.this_processor->pending_preemption = !ready;
     241        bool ready = TL_GET( preemption_state ).enabled && !TL_GET( preemption_state ).in_progress; // Check if preemption is safe
     242        TL_GET( this_processor )->pending_preemption = !ready;                  // Adjust the pending flag accordingly
    246243        return ready;
    247244}
     
    257254
    258255        // Start with preemption disabled until ready
    259         kernelTLS.preemption_state.enabled = false;
    260         kernelTLS.preemption_state.disable_count = 1;
     256        TL_GET( preemption_state ).enabled = false;
     257        TL_GET( preemption_state ).disable_count = 1;
    261258
    262259        // Initialize the event kernel
     
    323320        // before the kernel thread has even started running. When that happens an iterrupt
    324321        // we a null 'this_processor' will be caught, just ignore it.
    325         if(! kernelTLS.this_processor ) return;
     322        if(!TL_GET( this_processor )) return;
    326323
    327324        choose(sfp->si_value.sival_int) {
    328325                case PREEMPT_NORMAL   : ;// Normal case, nothing to do here
    329                 case PREEMPT_TERMINATE: verify( kernelTLS.this_processor->do_terminate);
     326                case PREEMPT_TERMINATE: verify(TL_GET( this_processor )->do_terminate);
    330327                default:
    331328                        abort( "internal error, signal value is %d", sfp->si_value.sival_int );
     
    335332        if( !preemption_ready() ) { return; }
    336333
    337         __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", kernelTLS.this_processor, kernelTLS.this_thread );
    338 
    339         // Sync flag : prevent recursive calls to the signal handler
    340         kernelTLS.preemption_state.in_progress = true;
    341 
    342         // We are about to CtxSwitch out of the signal handler, let other handlers in
    343         signal_unblock( SIGUSR1 );
    344 
    345         // TODO: this should go in finish action
    346         // Clear the in progress flag
    347         kernelTLS.preemption_state.in_progress = false;
     334        __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", TL_GET( this_processor ), TL_GET( this_thread ) );
     335
     336        TL_GET( preemption_state ).in_progress = true;  // Sync flag : prevent recursive calls to the signal handler
     337        signal_unblock( SIGUSR1 );                          // We are about to CtxSwitch out of the signal handler, let other handlers in
     338        TL_GET( preemption_state ).in_progress = false; // Clear the in progress flag
    348339
    349340        // Preemption can occur here
    350341
    351         BlockInternal( kernelTLS.this_thread ); // Do the actual CtxSwitch
     342        BlockInternal( (thread_desc*)TL_GET( this_thread ) ); // Do the actual CtxSwitch
    352343}
    353344
     
    418409
    419410void __cfaabi_check_preemption() {
    420         bool ready = kernelTLS.preemption_state.enabled;
     411        bool ready = TL_GET( preemption_state ).enabled;
    421412        if(!ready) { abort("Preemption should be ready"); }
    422413
Note: See TracChangeset for help on using the changeset viewer.