Changes in / [c659968:eb7f20c]
- Location:
- src/libcfa/concurrency
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
rc659968 reb7f20c 170 170 if( ! do_terminate ) { 171 171 __cfaabi_dbg_print_safe("Kernel : core %p signaling termination\n", &this); 172 do_terminate = true;172 terminate(&this); 173 173 P( terminated ); 174 174 pthread_join( kernel_thread, NULL ); -
src/libcfa/concurrency/kernel_private.h
rc659968 reb7f20c 60 60 void runThread(processor * this, thread_desc * dst); 61 61 void finishRunning(processor * this); 62 void terminate(processor * this); 62 63 void spin(processor * this, unsigned int * spin_count); 63 64 -
src/libcfa/concurrency/preemption.c
rc659968 reb7f20c 67 67 } 68 68 69 enum { 70 PREEMPT_NORMAL = 0, 71 PREEMPT_TERMINATE = 1, 72 }; 73 69 74 //============================================================================================= 70 75 // Kernel Preemption logic … … 209 214 // kill wrapper : signal a processor 210 215 static void preempt( processor * this ) { 211 pthread_kill( this->kernel_thread, SIGUSR1 ); 216 sigval_t value = { PREEMPT_NORMAL }; 217 pthread_sigqueue( this->kernel_thread, SIGUSR1, value ); 218 } 219 220 // kill wrapper : signal a processor 221 void terminate(processor * this) { 222 this->do_terminate = true; 223 sigval_t value = { PREEMPT_TERMINATE }; 224 pthread_sigqueue( this->kernel_thread, SIGUSR1, value ); 212 225 } 213 226 … … 298 311 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) { 299 312 __cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.CFA_REG_IP); ) 313 314 // SKULLDUGGERY: if a thread creates a processor and the immediately deletes it, 315 // the interrupt that is supposed to force the kernel thread to preempt might arrive 316 // before the kernel thread has even started running. When that happens an iterrupt 317 // we a null 'this_processor' will be caught, just ignore it. 318 if(!this_processor) return; 319 320 choose(sfp->si_value.sival_int) { 321 case PREEMPT_NORMAL : ;// Normal case, nothing to do here 322 case PREEMPT_TERMINATE: verify(this_processor->do_terminate); 323 default: 324 abortf( "internal error, signal value is %d", sfp->si_value.sival_int ); 325 } 300 326 301 327 // Check if it is safe to preempt here
Note: See TracChangeset
for help on using the changeset viewer.