Changeset c08c3cf for libcfa/src/concurrency/kernel.cfa
- Timestamp:
- Jan 20, 2021, 8:46:31 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:
- 481cf3a
- Parents:
- 467c8b7 (diff), 9db2c92 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r467c8b7 rc08c3cf 224 224 } 225 225 226 V( this->terminated );226 post( this->terminated ); 227 227 228 228 if(this == mainProcessor) { … … 624 624 // Unexpected Terminating logic 625 625 //============================================================================================= 626 627 extern "C" { 628 extern void __cfaabi_real_abort(void); 629 } 630 static volatile bool kernel_abort_called = false; 631 632 void * kernel_abort(void) __attribute__ ((__nothrow__)) { 633 // abort cannot be recursively entered by the same or different processors because all signal handlers return when 634 // the globalAbort flag is true. 635 bool first = !__atomic_test_and_set( &kernel_abort_called, __ATOMIC_SEQ_CST); 636 637 // first task to abort ? 638 if ( !first ) { 639 // We aren't the first to abort. 640 // I give up, just let C handle it 641 __cfaabi_real_abort(); 642 } 643 644 // disable interrupts, it no longer makes sense to try to interrupt this processor 645 disable_interrupts(); 646 647 return __cfaabi_tls.this_thread; 648 } 649 650 void kernel_abort_msg( void * kernel_data, char * abort_text, int abort_text_size ) { 651 $thread * thrd = ( $thread * ) kernel_data; 626 void __kernel_abort_msg( char * abort_text, int abort_text_size ) { 627 $thread * thrd = __cfaabi_tls.this_thread; 652 628 653 629 if(thrd) { … … 669 645 } 670 646 671 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) {672 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; 673 649 } 674 650 … … 688 664 // Kernel Utilities 689 665 //============================================================================================= 690 //-----------------------------------------------------------------------------691 // Locks692 void ?{}( semaphore & this, int count = 1 ) {693 (this.lock){};694 this.count = count;695 (this.waiting){};696 }697 void ^?{}(semaphore & this) {}698 699 bool P(semaphore & this) with( this ){700 lock( lock __cfaabi_dbg_ctx2 );701 count -= 1;702 if ( count < 0 ) {703 // queue current task704 append( waiting, active_thread() );705 706 // atomically release spin lock and block707 unlock( lock );708 park();709 return true;710 }711 else {712 unlock( lock );713 return false;714 }715 }716 717 bool V(semaphore & this) with( this ) {718 $thread * thrd = 0p;719 lock( lock __cfaabi_dbg_ctx2 );720 count += 1;721 if ( count <= 0 ) {722 // remove task at head of waiting list723 thrd = pop_head( waiting );724 }725 726 unlock( lock );727 728 // make new owner729 unpark( thrd );730 731 return thrd != 0p;732 }733 734 bool V(semaphore & this, unsigned diff) with( this ) {735 $thread * thrd = 0p;736 lock( lock __cfaabi_dbg_ctx2 );737 int release = max(-count, (int)diff);738 count += diff;739 for(release) {740 unpark( pop_head( waiting ) );741 }742 743 unlock( lock );744 745 return thrd != 0p;746 }747 748 666 //----------------------------------------------------------------------------- 749 667 // Debug
Note: See TracChangeset
for help on using the changeset viewer.