- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.cfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r6011658 r454f478 140 140 preemption_scope scope = { this }; 141 141 142 #if !defined(__CFA_NO_STATISTICS__) 143 unsigned long long last_tally = rdtscl(); 144 #endif 145 146 142 147 __cfadbg_print_safe(runtime_core, "Kernel : core %p started\n", this); 143 148 … … 206 211 // Are we done? 207 212 if( __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST) ) break MAIN_LOOP; 213 214 #if !defined(__CFA_NO_STATISTICS__) 215 unsigned long long curr = rdtscl(); 216 if(curr > (last_tally + 500000000)) { 217 __tally_stats(this->cltr->stats, __cfaabi_tls.this_stats); 218 last_tally = curr; 219 } 220 #endif 208 221 } 209 222 … … 211 224 } 212 225 213 V( this->terminated );226 post( this->terminated ); 214 227 215 228 if(this == mainProcessor) { … … 611 624 // Unexpected Terminating logic 612 625 //============================================================================================= 613 static __spinlock_t kernel_abort_lock; 614 static bool kernel_abort_called = false; 615 616 void * kernel_abort(void) __attribute__ ((__nothrow__)) { 617 // abort cannot be recursively entered by the same or different processors because all signal handlers return when 618 // the globalAbort flag is true. 619 lock( kernel_abort_lock __cfaabi_dbg_ctx2 ); 620 621 // disable interrupts, it no longer makes sense to try to interrupt this processor 622 disable_interrupts(); 623 624 // first task to abort ? 625 if ( kernel_abort_called ) { // not first task to abort ? 626 unlock( kernel_abort_lock ); 627 628 sigset_t mask; 629 sigemptyset( &mask ); 630 sigaddset( &mask, SIGALRM ); // block SIGALRM signals 631 sigaddset( &mask, SIGUSR1 ); // block SIGALRM signals 632 sigsuspend( &mask ); // block the processor to prevent further damage during abort 633 _exit( EXIT_FAILURE ); // if processor unblocks before it is killed, terminate it 634 } 635 else { 636 kernel_abort_called = true; 637 unlock( kernel_abort_lock ); 638 } 639 640 return __cfaabi_tls.this_thread; 641 } 642 643 void kernel_abort_msg( void * kernel_data, char * abort_text, int abort_text_size ) { 644 $thread * thrd = ( $thread * ) kernel_data; 626 void __kernel_abort_msg( char * abort_text, int abort_text_size ) { 627 $thread * thrd = __cfaabi_tls.this_thread; 645 628 646 629 if(thrd) { … … 662 645 } 663 646 664 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) {665 return get_coroutine( kernelTLS().this_thread) == get_coroutine(mainThread) ? 4 : 2;647 int __kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) { 648 return get_coroutine(__cfaabi_tls.this_thread) == get_coroutine(mainThread) ? 4 : 2; 666 649 } 667 650 … … 681 664 // Kernel Utilities 682 665 //============================================================================================= 683 //-----------------------------------------------------------------------------684 // Locks685 void ?{}( semaphore & this, int count = 1 ) {686 (this.lock){};687 this.count = count;688 (this.waiting){};689 }690 void ^?{}(semaphore & this) {}691 692 bool P(semaphore & this) with( this ){693 lock( lock __cfaabi_dbg_ctx2 );694 count -= 1;695 if ( count < 0 ) {696 // queue current task697 append( waiting, active_thread() );698 699 // atomically release spin lock and block700 unlock( lock );701 park();702 return true;703 }704 else {705 unlock( lock );706 return false;707 }708 }709 710 bool V(semaphore & this) with( this ) {711 $thread * thrd = 0p;712 lock( lock __cfaabi_dbg_ctx2 );713 count += 1;714 if ( count <= 0 ) {715 // remove task at head of waiting list716 thrd = pop_head( waiting );717 }718 719 unlock( lock );720 721 // make new owner722 unpark( thrd );723 724 return thrd != 0p;725 }726 727 bool V(semaphore & this, unsigned diff) with( this ) {728 $thread * thrd = 0p;729 lock( lock __cfaabi_dbg_ctx2 );730 int release = max(-count, (int)diff);731 count += diff;732 for(release) {733 unpark( pop_head( waiting ) );734 }735 736 unlock( lock );737 738 return thrd != 0p;739 }740 741 666 //----------------------------------------------------------------------------- 742 667 // Debug
Note:
See TracChangeset
for help on using the changeset viewer.