Changeset aec68b6 for libcfa/src/concurrency/kernel
- Timestamp:
- Apr 25, 2021, 10:11:27 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 24711a3, 5456537
- Parents:
- 9b71679 (diff), c323837 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- libcfa/src/concurrency/kernel
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
r9b71679 raec68b6 108 108 109 109 extern void disable_interrupts(); 110 extern void enable_interrupts_noPoll(); 111 extern void enable_interrupts( __cfaabi_dbg_ctx_param ); 110 extern void enable_interrupts( bool poll = false ); 112 111 113 112 extern "Cforall" { … … 220 219 // Mark as fulfilled, wake thread if needed 221 220 // return true if a thread was unparked 222 bool post(oneshot & this) {221 $thread * post(oneshot & this, bool do_unpark = true) { 223 222 struct $thread * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 224 if( got == 0p ) return false;225 unpark( got );226 return true;223 if( got == 0p ) return 0p; 224 if(do_unpark) unpark( got ); 225 return got; 227 226 } 228 227 } … … 336 335 // from the server side, mark the future as fulfilled 337 336 // delete it if needed 338 bool fulfil( future_t & this) {337 $thread * fulfil( future_t & this, bool do_unpark = true ) { 339 338 for() { 340 339 struct oneshot * expected = this.ptr; … … 344 343 #pragma GCC diagnostic ignored "-Wfree-nonheap-object" 345 344 #endif 346 if( expected == 3p ) { free( &this ); return false; }345 if( expected == 3p ) { free( &this ); return 0p; } 347 346 #if defined(__GNUC__) && __GNUC__ >= 7 348 347 #pragma GCC diagnostic pop … … 356 355 struct oneshot * want = expected == 0p ? 1p : 2p; 357 356 if(__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 358 if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return false; }359 bool ret = post( *expected);357 if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return 0p; } 358 $thread * ret = post( *expected, do_unpark ); 360 359 __atomic_store_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 361 360 return ret; … … 403 402 __VA_ARGS__ \ 404 403 } \ 405 if( !(in_kernel) ) enable_interrupts( __cfaabi_dbg_ctx); \404 if( !(in_kernel) ) enable_interrupts(); \ 406 405 } 407 406 #else -
libcfa/src/concurrency/kernel/startup.cfa
r9b71679 raec68b6 225 225 // Add the main thread to the ready queue 226 226 // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread 227 __schedule_thread(mainThread);227 schedule_thread$(mainThread); 228 228 229 229 // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX … … 238 238 239 239 /* paranoid */ verify( ! __preemption_enabled() ); 240 enable_interrupts( __cfaabi_dbg_ctx);240 enable_interrupts(); 241 241 /* paranoid */ verify( __preemption_enabled() ); 242 242 … … 530 530 disable_interrupts(); 531 531 init( this, name, _cltr, initT ); 532 enable_interrupts( __cfaabi_dbg_ctx);532 enable_interrupts(); 533 533 534 534 __cfadbg_print_safe(runtime_core, "Kernel : Starting core %p\n", &this); … … 557 557 disable_interrupts(); 558 558 deinit( this ); 559 enable_interrupts( __cfaabi_dbg_ctx);559 enable_interrupts(); 560 560 } 561 561 … … 595 595 // Unlock the RWlock 596 596 ready_mutate_unlock( last_size ); 597 enable_interrupts _noPoll(); // Don't poll, could be in main cluster597 enable_interrupts( false ); // Don't poll, could be in main cluster 598 598 } 599 599 … … 610 610 // Unlock the RWlock 611 611 ready_mutate_unlock( last_size ); 612 enable_interrupts _noPoll(); // Don't poll, could be in main cluster612 enable_interrupts( false ); // Don't poll, could be in main cluster 613 613 614 614 #if !defined(__CFA_NO_STATISTICS__)
Note:
See TracChangeset
for help on using the changeset viewer.