- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.cfa (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
rb4b63e8 r58d64a4 246 246 thrd_dst->state = Active; 247 247 248 __cfaabi_dbg_debug_do( 249 thrd_dst->park_stale = true; 250 thrd_dst->unpark_stale = true; 251 ) 248 252 // Update global state 249 253 kernelTLS.this_thread = thrd_dst; … … 251 255 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 252 256 /* paranoid */ verify( kernelTLS.this_thread == thrd_dst ); 253 /* paranoid */ verify( thrd_dst->context.SP );254 257 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor 255 258 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor 256 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary );257 258 259 259 260 260 261 // set context switch to the thread that the processor is executing 262 verify( thrd_dst->context.SP ); 261 263 __cfactx_switch( &proc_cor->context, &thrd_dst->context ); 262 264 // when __cfactx_switch returns we are back in the processor coroutine 263 265 264 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary );265 266 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); 266 267 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); 267 /* paranoid */ verify( thrd_dst->context.SP );268 268 /* paranoid */ verify( kernelTLS.this_thread == thrd_dst ); 269 269 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); … … 288 288 // The thread has halted, it should never be scheduled/run again 289 289 // We may need to wake someone up here since 290 unpark( this->destroyer );290 unpark( this->destroyer __cfaabi_dbg_ctx2 ); 291 291 this->destroyer = 0p; 292 292 break RUNNING; … … 298 298 // set state of processor coroutine to active and the thread to inactive 299 299 int old_ticket = __atomic_fetch_sub(&thrd_dst->ticket, 1, __ATOMIC_SEQ_CST); 300 __cfaabi_dbg_debug_do( thrd_dst->park_result = old_ticket; ) 300 301 switch(old_ticket) { 301 302 case 1: … … 334 335 __x87_store; 335 336 #endif 336 /* paranoid */ verify( proc_cor->context.SP ); 337 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary ); 337 verify( proc_cor->context.SP ); 338 338 __cfactx_switch( &thrd_src->context, &proc_cor->context ); 339 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary );340 339 #if defined( __i386 ) || defined( __x86_64 ) 341 340 __x87_load; … … 369 368 /* paranoid */ #endif 370 369 /* paranoid */ verifyf( thrd->link.next == 0p, "Expected null got %p", thrd->link.next ); 371 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd->canary );372 373 370 374 371 if (thrd->preempted == __NO_PREEMPTION) thrd->state = Ready; … … 407 404 408 405 // KERNEL ONLY unpark with out disabling interrupts 409 void __unpark( struct __processor_id_t * id, $thread * thrd ) { 406 void __unpark( struct __processor_id_t * id, $thread * thrd __cfaabi_dbg_ctx_param2 ) { 407 // record activity 408 __cfaabi_dbg_record_thrd( *thrd, false, caller ); 409 410 410 int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST); 411 __cfaabi_dbg_debug_do( thrd->unpark_result = old_ticket; thrd->unpark_state = thrd->state; ) 411 412 switch(old_ticket) { 412 413 case 1: … … 426 427 } 427 428 428 void unpark( $thread * thrd ) {429 void unpark( $thread * thrd __cfaabi_dbg_ctx_param2 ) { 429 430 if( !thrd ) return; 430 431 431 432 disable_interrupts(); 432 __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd );433 __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd __cfaabi_dbg_ctx_fwd2 ); 433 434 enable_interrupts( __cfaabi_dbg_ctx ); 434 435 } 435 436 436 void park( void) {437 void park( __cfaabi_dbg_ctx_param ) { 437 438 /* paranoid */ verify( kernelTLS.preemption_state.enabled ); 438 439 disable_interrupts(); 439 440 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 440 441 /* paranoid */ verify( kernelTLS.this_thread->preempted == __NO_PREEMPTION ); 442 443 // record activity 444 __cfaabi_dbg_record_thrd( *kernelTLS.this_thread, true, caller ); 441 445 442 446 returnToKernel(); … … 646 650 // atomically release spin lock and block 647 651 unlock( lock ); 648 park( );652 park( __cfaabi_dbg_ctx ); 649 653 return true; 650 654 } … … 667 671 668 672 // make new owner 669 unpark( thrd );673 unpark( thrd __cfaabi_dbg_ctx2 ); 670 674 671 675 return thrd != 0p; … … 678 682 count += diff; 679 683 for(release) { 680 unpark( pop_head( waiting ) );684 unpark( pop_head( waiting ) __cfaabi_dbg_ctx2 ); 681 685 } 682 686 … … 694 698 this.prev_thrd = kernelTLS.this_thread; 695 699 } 700 701 void __cfaabi_dbg_record_thrd($thread & this, bool park, const char prev_name[]) { 702 if(park) { 703 this.park_caller = prev_name; 704 this.park_stale = false; 705 } 706 else { 707 this.unpark_caller = prev_name; 708 this.unpark_stale = false; 709 } 710 } 696 711 } 697 712 )
Note:
See TracChangeset
for help on using the changeset viewer.