- File:
-
- 1 edited
-
src/libcfa/concurrency/preemption.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/preemption.c
r4dad189 r169d944 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Feb 6 15:00:36201813 // Update Count : 1 012 // Last Modified On : Thu Feb 8 16:12:58 2018 13 // Update Count : 12 14 14 // 15 15 … … 67 67 } 68 68 69 enum {70 PREEMPT_NORMAL = 0,71 PREEMPT_TERMINATE = 1,72 };73 74 69 //============================================================================================= 75 70 // Kernel Preemption logic … … 197 192 198 193 if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) { 199 abort f( "internal error, pthread_sigmask" );194 abort( "internal error, pthread_sigmask" ); 200 195 } 201 196 } … … 208 203 209 204 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) { 210 abort f( "internal error, pthread_sigmask" );205 abort( "internal error, pthread_sigmask" ); 211 206 } 212 207 } … … 214 209 // kill wrapper : signal a processor 215 210 static void preempt( processor * this ) { 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 ); 211 pthread_kill( this->kernel_thread, SIGUSR1 ); 225 212 } 226 213 … … 247 234 // Called from kernel_startup 248 235 void kernel_start_preemption() { 249 __cfaabi_dbg_print_safe( "Kernel : Starting preemption\n");236 __cfaabi_dbg_print_safe( "Kernel : Starting preemption\n" ); 250 237 251 238 // Start with preemption disabled until ready … … 268 255 // Called from kernel_shutdown 269 256 void kernel_stop_preemption() { 270 __cfaabi_dbg_print_safe( "Kernel : Preemption stopping\n");257 __cfaabi_dbg_print_safe( "Kernel : Preemption stopping\n" ); 271 258 272 259 // Block all signals since we are already shutting down … … 284 271 // Preemption is now fully stopped 285 272 286 __cfaabi_dbg_print_safe( "Kernel : Preemption stopped\n");273 __cfaabi_dbg_print_safe( "Kernel : Preemption stopped\n" ); 287 274 } 288 275 … … 312 299 __cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.CFA_REG_IP); ) 313 300 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 arrive316 // before the kernel thread has even started running. When that happens an iterrupt317 // 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 here322 case PREEMPT_TERMINATE: verify(this_processor->do_terminate);323 default:324 abortf( "internal error, signal value is %d", sfp->si_value.sival_int );325 }326 327 301 // Check if it is safe to preempt here 328 302 if( !preemption_ready() ) { return; } 329 303 330 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", this_processor, this_thread);304 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", this_processor, this_thread); 331 305 332 306 preemption_in_progress = true; // Sync flag : prevent recursive calls to the signal handler … … 348 322 349 323 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) { 350 abort f( "internal error, pthread_sigmask" );324 abort( "internal error, pthread_sigmask" ); 351 325 } 352 326 … … 365 339 continue; 366 340 case EINVAL : 367 abort f("Timeout was invalid.");341 abort( "Timeout was invalid." ); 368 342 default: 369 abort f("Unhandled error %d", err);343 abort( "Unhandled error %d", err); 370 344 } 371 345 } … … 374 348 assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int); 375 349 376 // __cfaabi_dbg_print_safe( "Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );350 // __cfaabi_dbg_print_safe( "Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int ); 377 351 // Switch on the code (a.k.a. the sender) to 378 352 switch( info.si_code ) … … 382 356 case SI_TIMER: 383 357 case SI_KERNEL: 384 // __cfaabi_dbg_print_safe( "Kernel : Preemption thread tick\n");358 // __cfaabi_dbg_print_safe( "Kernel : Preemption thread tick\n" ); 385 359 lock( event_kernel->lock __cfaabi_dbg_ctx2 ); 386 360 tick_preemption(); … … 396 370 397 371 EXIT: 398 __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n");372 __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n" ); 399 373 return NULL; 400 374 }
Note:
See TracChangeset
for help on using the changeset viewer.