Changeset a3821fa for libcfa/src/concurrency
- Timestamp:
- Apr 24, 2021, 7:03:47 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:
- 734908c
- Parents:
- c6c7e6c
- Location:
- libcfa/src/concurrency
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/alarm.cfa
rc6c7e6c ra3821fa 116 116 unlock( event_kernel->lock ); 117 117 this->set = true; 118 enable_interrupts( __cfaabi_dbg_ctx);118 enable_interrupts(); 119 119 } 120 120 … … 127 127 } 128 128 unlock( event_kernel->lock ); 129 enable_interrupts( __cfaabi_dbg_ctx);129 enable_interrupts(); 130 130 this->set = false; 131 131 } -
libcfa/src/concurrency/clib/cfathread.cfa
rc6c7e6c ra3821fa 117 117 118 118 this_thrd->state = Ready; 119 enable_interrupts( __cfaabi_dbg_ctx);119 enable_interrupts(); 120 120 } 121 121 -
libcfa/src/concurrency/invoke.c
rc6c7e6c ra3821fa 34 34 35 35 extern void disable_interrupts() OPTIONAL_THREAD; 36 extern void enable_interrupts( _ _cfaabi_dbg_ctx_param);36 extern void enable_interrupts( _Bool poll ); 37 37 38 38 void __cfactx_invoke_coroutine( … … 82 82 ) { 83 83 // Officially start the thread by enabling preemption 84 enable_interrupts( __cfaabi_dbg_ctx);84 enable_interrupts( true ); 85 85 86 86 // Call the main of the thread -
libcfa/src/concurrency/io.cfa
rc6c7e6c ra3821fa 244 244 // Allocation was successful 245 245 __STATS__( true, io.alloc.fast += 1; ) 246 enable_interrupts( __cfaabi_dbg_ctx);246 enable_interrupts(); 247 247 248 248 __cfadbg_print_safe(io, "Kernel I/O : fast allocation successful from ring %d\n", ctx->fd); … … 256 256 // Fast path failed, fallback on arbitration 257 257 __STATS__( true, io.alloc.slow += 1; ) 258 enable_interrupts( __cfaabi_dbg_ctx);258 enable_interrupts(); 259 259 260 260 $io_arbiter * ioarb = proc->cltr->io.arbiter; … … 314 314 // Mark the instance as no longer in-use, re-enable interrupts and return 315 315 __STATS__( true, io.submit.fast += 1; ) 316 enable_interrupts( __cfaabi_dbg_ctx);316 enable_interrupts(); 317 317 318 318 __cfadbg_print_safe(io, "Kernel I/O : submitted on fast path\n"); … … 322 322 // Fast path failed, fallback on arbitration 323 323 __STATS__( true, io.submit.slow += 1; ) 324 enable_interrupts( __cfaabi_dbg_ctx);324 enable_interrupts(); 325 325 326 326 __cfadbg_print_safe(io, "Kernel I/O : falling back on arbiter for submission\n"); -
libcfa/src/concurrency/kernel.cfa
rc6c7e6c ra3821fa 126 126 extern void __disable_interrupts_hard(); 127 127 extern void __enable_interrupts_hard(); 128 129 static inline void __disable_interrupts_checked() { 130 /* paranoid */ verify( __preemption_enabled() ); 131 disable_interrupts(); 132 /* paranoid */ verify( ! __preemption_enabled() ); 133 } 134 135 static inline void __enable_interrupts_checked( bool poll = true ) { 136 /* paranoid */ verify( ! __preemption_enabled() ); 137 enable_interrupts( poll ); 138 /* paranoid */ verify( __preemption_enabled() ); 139 } 128 140 129 141 //============================================================================================= … … 517 529 518 530 if(__must_unpark(thrd)) { 519 /* paranoid */ verify( publicTLS_get(this_proc_id) );520 531 disable_interrupts(); 521 522 /* paranoid */ verify( ! __preemption_enabled() ); 523 524 // Wake lost the race, 525 __schedule_thread( thrd ); 526 527 /* paranoid */ verify( ! __preemption_enabled() ); 528 529 enable_interrupts_noPoll(); 530 /* paranoid */ verify( publicTLS_get(this_proc_id) ); 532 // Wake lost the race, 533 __schedule_thread( thrd ); 534 enable_interrupts(false); 531 535 } 532 536 } 533 537 534 538 void park( void ) { 535 /* paranoid */ verify( __preemption_enabled() ); 536 disable_interrupts(); 537 /* paranoid */ verify( ! __preemption_enabled() ); 538 /* paranoid */ verify( kernelTLS().this_thread->preempted == __NO_PREEMPTION ); 539 540 returnToKernel(); 541 542 /* paranoid */ verify( ! __preemption_enabled() ); 543 enable_interrupts( __cfaabi_dbg_ctx ); 544 /* paranoid */ verify( __preemption_enabled() ); 539 __disable_interrupts_checked(); 540 /* paranoid */ verify( kernelTLS().this_thread->preempted == __NO_PREEMPTION ); 541 returnToKernel(); 542 __enable_interrupts_checked(); 545 543 546 544 } … … 582 580 // KERNEL ONLY 583 581 bool force_yield( __Preemption_Reason reason ) { 584 /* paranoid */ verify( __preemption_enabled() ); 585 disable_interrupts(); 586 /* paranoid */ verify( ! __preemption_enabled() ); 587 588 $thread * thrd = kernelTLS().this_thread; 589 /* paranoid */ verify(thrd->state == Active); 590 591 // SKULLDUGGERY: It is possible that we are preempting this thread just before 592 // it was going to park itself. If that is the case and it is already using the 593 // intrusive fields then we can't use them to preempt the thread 594 // If that is the case, abandon the preemption. 595 bool preempted = false; 596 if(thrd->link.next == 0p) { 597 preempted = true; 598 thrd->preempted = reason; 599 returnToKernel(); 600 } 601 602 /* paranoid */ verify( ! __preemption_enabled() ); 603 enable_interrupts_noPoll(); 604 /* paranoid */ verify( __preemption_enabled() ); 605 582 __disable_interrupts_checked(); 583 $thread * thrd = kernelTLS().this_thread; 584 /* paranoid */ verify(thrd->state == Active); 585 586 // SKULLDUGGERY: It is possible that we are preempting this thread just before 587 // it was going to park itself. If that is the case and it is already using the 588 // intrusive fields then we can't use them to preempt the thread 589 // If that is the case, abandon the preemption. 590 bool preempted = false; 591 if(thrd->link.next == 0p) { 592 preempted = true; 593 thrd->preempted = reason; 594 returnToKernel(); 595 } 596 __enable_interrupts_checked( false ); 606 597 return preempted; 607 598 } … … 648 639 __cfadbg_print_safe(runtime_core, "Kernel : waking Processor %p\n", this); 649 640 650 disable_interrupts();641 __disable_interrupts_checked(); 651 642 /* paranoid */ verify( ! __preemption_enabled() ); 652 643 eventfd_t val; 653 644 val = 1; 654 645 eventfd_write( this->idle, val ); 655 enable_interrupts( __cfaabi_dbg_ctx);646 __enable_interrupts_checked(); 656 647 } 657 648 -
libcfa/src/concurrency/kernel/fwd.hfa
rc6c7e6c ra3821fa 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" { … … 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
rc6c7e6c ra3821fa 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__) -
libcfa/src/concurrency/kernel_private.hfa
rc6c7e6c ra3821fa 29 29 extern "C" { 30 30 void disable_interrupts() OPTIONAL_THREAD; 31 void enable_interrupts_noPoll(); 32 void enable_interrupts( __cfaabi_dbg_ctx_param ); 31 void enable_interrupts( bool poll = true ); 33 32 } 34 33 -
libcfa/src/concurrency/preemption.cfa
rc6c7e6c ra3821fa 315 315 // Enable interrupts by decrementing the counter 316 316 // If counter reaches 0, execute any pending __cfactx_switch 317 void enable_interrupts( __cfaabi_dbg_ctx_param) {317 void enable_interrupts( bool poll ) { 318 318 // Cache the processor now since interrupts can start happening after the atomic store 319 319 processor * proc = __cfaabi_tls.this_processor; 320 /* paranoid */ verify( proc );320 /* paranoid */ verify( !poll || proc ); 321 321 322 322 with( __cfaabi_tls.preemption_state ){ … … 340 340 // Signal the compiler that a fence is needed but only for signal handlers 341 341 __atomic_signal_fence(__ATOMIC_RELEASE); 342 if( p roc->pending_preemption ) {342 if( poll && proc->pending_preemption ) { 343 343 proc->pending_preemption = false; 344 344 force_yield( __POLL_PREEMPTION ); 345 345 } 346 346 } 347 }348 349 // For debugging purposes : keep track of the last person to enable the interrupts350 __cfaabi_dbg_debug_do( proc->last_enable = caller; )351 }352 353 // Disable interrupts by incrementint the counter354 // Don't execute any pending __cfactx_switch even if counter reaches 0355 void enable_interrupts_noPoll() {356 unsigned short prev = __cfaabi_tls.preemption_state.disable_count;357 __cfaabi_tls.preemption_state.disable_count -= 1;358 // If this triggers someone is enabled already enabled interrupts359 /* paranoid */ verifyf( prev != 0u, "Incremented from %u\n", prev );360 if( prev == 1 ) {361 #if GCC_VERSION > 50000362 static_assert(__atomic_always_lock_free(sizeof(__cfaabi_tls.preemption_state.enabled), &__cfaabi_tls.preemption_state.enabled), "Must be lock-free");363 #endif364 // Set enabled flag to true365 // should be atomic to avoid preemption in the middle of the operation.366 // use memory order RELAXED since there is no inter-thread on this variable requirements367 __atomic_store_n(&__cfaabi_tls.preemption_state.enabled, true, __ATOMIC_RELAXED);368 369 // Signal the compiler that a fence is needed but only for signal handlers370 __atomic_signal_fence(__ATOMIC_RELEASE);371 347 } 372 348 } -
libcfa/src/concurrency/thread.cfa
rc6c7e6c ra3821fa 135 135 136 136 __schedule_thread( this_thrd ); 137 enable_interrupts( __cfaabi_dbg_ctx);137 enable_interrupts(); 138 138 } 139 139 … … 168 168 disable_interrupts(); 169 169 uint64_t ret = __tls_rand(); 170 enable_interrupts( __cfaabi_dbg_ctx);170 enable_interrupts(); 171 171 return ret; 172 172 }
Note: See TracChangeset
for help on using the changeset viewer.