- File:
-
- 1 edited
-
src/libcfa/concurrency/preemption.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/preemption.c
r14a61b5 rb68fc85 234 234 } 235 235 236 // KERNEL ONLY 236 237 237 // Check if a CtxSwitch signal handler shoud defer 238 238 // If true : preemption is safe 239 239 // If false : preemption is unsafe and marked as pending 240 240 static 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 246 243 return ready; 247 244 } … … 257 254 258 255 // 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; 261 258 262 259 // Initialize the event kernel … … 323 320 // before the kernel thread has even started running. When that happens an iterrupt 324 321 // we a null 'this_processor' will be caught, just ignore it. 325 if(! kernelTLS.this_processor) return;322 if(!TL_GET( this_processor )) return; 326 323 327 324 choose(sfp->si_value.sival_int) { 328 325 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); 330 327 default: 331 328 abort( "internal error, signal value is %d", sfp->si_value.sival_int ); … … 335 332 if( !preemption_ready() ) { return; } 336 333 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 348 339 349 340 // Preemption can occur here 350 341 351 BlockInternal( kernelTLS.this_thread); // Do the actual CtxSwitch342 BlockInternal( (thread_desc*)TL_GET( this_thread ) ); // Do the actual CtxSwitch 352 343 } 353 344 … … 418 409 419 410 void __cfaabi_check_preemption() { 420 bool ready = kernelTLS.preemption_state.enabled;411 bool ready = TL_GET( preemption_state ).enabled; 421 412 if(!ready) { abort("Preemption should be ready"); } 422 413
Note:
See TracChangeset
for help on using the changeset viewer.