- Timestamp:
- Feb 6, 2018, 10:07:18 AM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 7323573
- Parents:
- 0188a0bc
- Location:
- src
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/invoke.h
r0188a0bc r82c948c 121 121 // coroutine body used to store context 122 122 struct coroutine_desc self_cor; 123 124 // current active context 125 struct coroutine_desc * curr_cor; 123 126 124 127 // monitor body used for mutual exclusion -
src/libcfa/concurrency/kernel.c
r0188a0bc r82c948c 108 108 void ?{}( thread_desc & this, current_stack_info_t * info) with( this ) { 109 109 self_cor{ info }; 110 curr_cor = &self_cor; 111 self_mon.owner = &this; 112 self_mon.recursion = 1; 113 self_mon_p = &self_mon; 114 next = NULL; 115 __cfaabi_dbg_debug_do( 116 dbg_next = NULL; 117 dbg_prev = NULL; 118 __cfaabi_dbg_thread_register(&this); 119 ) 120 121 monitors{ &self_mon_p, 1, (fptr_t)0 }; 110 122 } 111 123 … … 225 237 // from the processor coroutine to the target thread 226 238 void runThread(processor * this, thread_desc * dst) { 239 assert(dst->curr_cor); 227 240 coroutine_desc * proc_cor = get_coroutine(*this->runner); 228 coroutine_desc * thrd_cor = get_coroutine(dst);241 coroutine_desc * thrd_cor = dst->curr_cor; 229 242 230 243 //Reset the terminating actions here … … 237 250 ThreadCtxSwitch(proc_cor, thrd_cor); 238 251 // when ThreadCtxSwitch returns we are back in the processor coroutine 252 } 253 254 void returnToKernel() { 255 coroutine_desc * proc_cor = get_coroutine(*this_processor->runner); 256 coroutine_desc * thrd_cor = this_thread->curr_cor = this_coroutine; 257 ThreadCtxSwitch(thrd_cor, proc_cor); 239 258 } 240 259 … … 360 379 disable_interrupts(); 361 380 verify( !preemption_enabled ); 362 suspend();381 returnToKernel(); 363 382 verify( !preemption_enabled ); 364 383 enable_interrupts( __cfaabi_dbg_ctx ); … … 371 390 372 391 verify( !preemption_enabled ); 373 suspend();392 returnToKernel(); 374 393 verify( !preemption_enabled ); 375 394 … … 383 402 384 403 verify( !preemption_enabled ); 385 suspend();404 returnToKernel(); 386 405 verify( !preemption_enabled ); 387 406 … … 397 416 398 417 verify( !preemption_enabled ); 399 suspend();418 returnToKernel(); 400 419 verify( !preemption_enabled ); 401 420 … … 410 429 411 430 verify( !preemption_enabled ); 412 suspend();431 returnToKernel(); 413 432 verify( !preemption_enabled ); 414 433 … … 425 444 426 445 verify( !preemption_enabled ); 427 suspend();446 returnToKernel(); 428 447 verify( !preemption_enabled ); 429 448 … … 437 456 this_processor->finish.thrd = thrd; 438 457 439 suspend();458 returnToKernel(); 440 459 } 441 460 … … 502 521 // which is currently here 503 522 mainProcessor->do_terminate = true; 504 suspend();523 returnToKernel(); 505 524 506 525 // THE SYSTEM IS NOW COMPLETELY STOPPED -
src/libcfa/concurrency/thread.c
r0188a0bc r82c948c 34 34 self_cor{}; 35 35 self_cor.name = "Anonymous Coroutine"; 36 curr_cor = &self_cor; 36 37 self_mon.owner = &this; 37 38 self_mon.recursion = 1; … … 104 105 dst->state = Active; 105 106 106 //update the last resumer107 dst->last = src;108 109 107 // set new coroutine that the processor is executing 110 108 // and context switch to it
Note: See TracChangeset
for help on using the changeset viewer.