Changeset 2b22e050 for src/libcfa/concurrency/kernel.c
- Timestamp:
- May 14, 2018, 8:45:23 AM (6 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, with_gc
- Children:
- a0cfa44
- Parents:
- 1dbc8590 (diff), 52df81c (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
-
src/libcfa/concurrency/kernel.c
r1dbc8590 r2b22e050 49 49 thread_desc * mainThread; 50 50 51 struct { __dllist_t(thread_desc) list; __spinlock_t lock; } global_threads ; 52 struct { __dllist_t(cluster ) list; __spinlock_t lock; } global_clusters; 53 51 54 //----------------------------------------------------------------------------- 52 55 // Global state … … 117 120 self_mon_p = &self_mon; 118 121 next = NULL; 119 __cfaabi_dbg_debug_do( 120 dbg_next = NULL; 121 dbg_prev = NULL; 122 __cfaabi_dbg_thread_register(&this); 123 ) 122 123 node.next = NULL; 124 node.prev = NULL; 125 doregister(this); 124 126 125 127 monitors{ &self_mon_p, 1, (fptr_t)0 }; … … 167 169 ready_queue{}; 168 170 ready_queue_lock{}; 171 172 procs{ __get }; 173 idles{ __get }; 174 175 doregister(this); 169 176 } 170 177 171 178 void ^?{}(cluster & this) { 172 179 unregister(this); 173 180 } 174 181 … … 182 189 183 190 __cfaabi_dbg_print_safe("Kernel : core %p starting\n", this); 191 192 doregister(this->cltr, this); 184 193 185 194 { … … 215 224 __cfaabi_dbg_print_safe("Kernel : core %p stopping\n", this); 216 225 } 226 227 unregister(this->cltr, this); 217 228 218 229 V( this->terminated ); … … 512 523 __cfaabi_dbg_print_safe("Kernel : Starting\n"); 513 524 525 global_threads. list{ __get }; 526 global_threads. lock{}; 527 global_clusters.list{ __get }; 528 global_clusters.lock{}; 529 514 530 // Initialize the main cluster 515 531 mainCluster = (cluster *)&storage_mainCluster; … … 639 655 640 656 static __spinlock_t kernel_abort_lock; 641 static __spinlock_t kernel_debug_lock;642 657 static bool kernel_abort_called = false; 643 658 … … 648 663 649 664 // first task to abort ? 650 if ( ! kernel_abort_called ) { // not first task to abort ? 665 if ( kernel_abort_called ) { // not first task to abort ? 666 unlock( kernel_abort_lock ); 667 668 sigset_t mask; 669 sigemptyset( &mask ); 670 sigaddset( &mask, SIGALRM ); // block SIGALRM signals 671 sigsuspend( &mask ); // block the processor to prevent further damage during abort 672 _exit( EXIT_FAILURE ); // if processor unblocks before it is killed, terminate it 673 } 674 else { 651 675 kernel_abort_called = true; 652 676 unlock( kernel_abort_lock ); 653 677 } 654 else {655 unlock( kernel_abort_lock );656 657 sigset_t mask;658 sigemptyset( &mask );659 sigaddset( &mask, SIGALRM ); // block SIGALRM signals660 sigaddset( &mask, SIGUSR1 ); // block SIGUSR1 signals661 sigsuspend( &mask ); // block the processor to prevent further damage during abort662 _exit( EXIT_FAILURE ); // if processor unblocks before it is killed, terminate it663 }664 678 665 679 return kernelTLS.this_thread; … … 669 683 thread_desc * thrd = kernel_data; 670 684 671 int len = snprintf( abort_text, abort_text_size, "Error occurred while executing task %.256s (%p)", thrd->self_cor.name, thrd ); 672 __cfaabi_dbg_bits_write( abort_text, len ); 673 674 if ( get_coroutine(thrd) != kernelTLS.this_coroutine ) { 675 len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", kernelTLS.this_coroutine->name, kernelTLS.this_coroutine ); 685 if(thrd) { 686 int len = snprintf( abort_text, abort_text_size, "Error occurred while executing thread %.256s (%p)", thrd->self_cor.name, thrd ); 676 687 __cfaabi_dbg_bits_write( abort_text, len ); 688 689 if ( get_coroutine(thrd) != kernelTLS.this_coroutine ) { 690 len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", kernelTLS.this_coroutine->name, kernelTLS.this_coroutine ); 691 __cfaabi_dbg_bits_write( abort_text, len ); 692 } 693 else { 694 __cfaabi_dbg_bits_write( ".\n", 2 ); 695 } 677 696 } 678 697 else { 679 __cfaabi_dbg_bits_write( ".\n", 2);698 int len = snprintf( abort_text, abort_text_size, "Error occurred outside of any thread.\n" ); 680 699 } 681 700 } … … 684 703 return get_coroutine(kernelTLS.this_thread) == get_coroutine(mainThread) ? 4 : 2; 685 704 } 705 706 static __spinlock_t kernel_debug_lock; 686 707 687 708 extern "C" { … … 738 759 739 760 //----------------------------------------------------------------------------- 761 // Global Queues 762 void doregister( thread_desc & thrd ) { 763 // lock ( global_thread.lock ); 764 // push_front( global_thread.list, thrd ); 765 // unlock ( global_thread.lock ); 766 } 767 768 void unregister( thread_desc & thrd ) { 769 // lock ( global_thread.lock ); 770 // remove( global_thread.list, thrd ); 771 // unlock( global_thread.lock ); 772 } 773 774 void doregister( cluster & cltr ) { 775 // lock ( global_cluster.lock ); 776 // push_front( global_cluster.list, cltr ); 777 // unlock ( global_cluster.lock ); 778 } 779 780 void unregister( cluster & cltr ) { 781 // lock ( global_cluster.lock ); 782 // remove( global_cluster.list, cltr ); 783 // unlock( global_cluster.lock ); 784 } 785 786 787 void doregister( cluster * cltr, processor * proc ) { 788 // lock (cltr->proc_list_lock __cfaabi_dbg_ctx2); 789 // push_front(cltr->procs, *proc); 790 // unlock (cltr->proc_list_lock); 791 } 792 793 void unregister( cluster * cltr, processor * proc ) { 794 // lock (cltr->proc_list_lock __cfaabi_dbg_ctx2); 795 // remove(cltr->procs, *proc ); 796 // unlock(cltr->proc_list_lock); 797 } 798 799 //----------------------------------------------------------------------------- 740 800 // Debug 741 801 __cfaabi_dbg_debug_do( 742 struct {743 thread_desc * tail;744 } __cfaabi_dbg_thread_list = { NULL };745 746 void __cfaabi_dbg_thread_register( thread_desc * thrd ) {747 if( !__cfaabi_dbg_thread_list.tail ) {748 __cfaabi_dbg_thread_list.tail = thrd;749 return;750 }751 __cfaabi_dbg_thread_list.tail->dbg_next = thrd;752 thrd->dbg_prev = __cfaabi_dbg_thread_list.tail;753 __cfaabi_dbg_thread_list.tail = thrd;754 }755 756 void __cfaabi_dbg_thread_unregister( thread_desc * thrd ) {757 thread_desc * prev = thrd->dbg_prev;758 thread_desc * next = thrd->dbg_next;759 760 if( next ) { next->dbg_prev = prev; }761 else {762 assert( __cfaabi_dbg_thread_list.tail == thrd );763 __cfaabi_dbg_thread_list.tail = prev;764 }765 766 if( prev ) { prev->dbg_next = next; }767 768 thrd->dbg_prev = NULL;769 thrd->dbg_next = NULL;770 }771 772 802 void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name) { 773 803 this.prev_name = prev_name;
Note: See TracChangeset
for help on using the changeset viewer.