- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.cfa (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r58d64a4 rb4b63e8 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 )252 248 // Update global state 253 249 kernelTLS.this_thread = thrd_dst; … … 255 251 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 256 252 /* paranoid */ verify( kernelTLS.this_thread == thrd_dst ); 253 /* paranoid */ verify( thrd_dst->context.SP ); 257 254 /* 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 258 255 /* 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 259 258 260 259 261 260 // set context switch to the thread that the processor is executing 262 verify( thrd_dst->context.SP );263 261 __cfactx_switch( &proc_cor->context, &thrd_dst->context ); 264 262 // when __cfactx_switch returns we are back in the processor coroutine 265 263 264 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary ); 266 265 /* 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 ); 267 266 /* 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 __cfaabi_dbg_ctx2);290 unpark( this->destroyer ); 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; )301 300 switch(old_ticket) { 302 301 case 1: … … 335 334 __x87_store; 336 335 #endif 337 verify( proc_cor->context.SP ); 336 /* paranoid */ verify( proc_cor->context.SP ); 337 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary ); 338 338 __cfactx_switch( &thrd_src->context, &proc_cor->context ); 339 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary ); 339 340 #if defined( __i386 ) || defined( __x86_64 ) 340 341 __x87_load; … … 368 369 /* paranoid */ #endif 369 370 /* paranoid */ verifyf( thrd->link.next == 0p, "Expected null got %p", thrd->link.next ); 371 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd->canary ); 372 370 373 371 374 if (thrd->preempted == __NO_PREEMPTION) thrd->state = Ready; … … 404 407 405 408 // KERNEL ONLY unpark with out disabling interrupts 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 409 void __unpark( struct __processor_id_t * id, $thread * thrd ) { 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; )412 411 switch(old_ticket) { 413 412 case 1: … … 427 426 } 428 427 429 void unpark( $thread * thrd __cfaabi_dbg_ctx_param2) {428 void unpark( $thread * thrd ) { 430 429 if( !thrd ) return; 431 430 432 431 disable_interrupts(); 433 __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd __cfaabi_dbg_ctx_fwd2);432 __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd ); 434 433 enable_interrupts( __cfaabi_dbg_ctx ); 435 434 } 436 435 437 void park( __cfaabi_dbg_ctx_param) {436 void park( void ) { 438 437 /* paranoid */ verify( kernelTLS.preemption_state.enabled ); 439 438 disable_interrupts(); 440 439 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 441 440 /* paranoid */ verify( kernelTLS.this_thread->preempted == __NO_PREEMPTION ); 442 443 // record activity444 __cfaabi_dbg_record_thrd( *kernelTLS.this_thread, true, caller );445 441 446 442 returnToKernel(); … … 650 646 // atomically release spin lock and block 651 647 unlock( lock ); 652 park( __cfaabi_dbg_ctx);648 park(); 653 649 return true; 654 650 } … … 671 667 672 668 // make new owner 673 unpark( thrd __cfaabi_dbg_ctx2);669 unpark( thrd ); 674 670 675 671 return thrd != 0p; … … 682 678 count += diff; 683 679 for(release) { 684 unpark( pop_head( waiting ) __cfaabi_dbg_ctx2);680 unpark( pop_head( waiting ) ); 685 681 } 686 682 … … 698 694 this.prev_thrd = kernelTLS.this_thread; 699 695 } 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 }711 696 } 712 697 )
Note:
See TracChangeset
for help on using the changeset viewer.