Changes in src/libcfa/concurrency/kernel.c [5510027:85b1deb]
- File:
-
- 1 edited
-
src/libcfa/concurrency/kernel.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
r5510027 r85b1deb 16 16 //C Includes 17 17 #include <stddef.h> 18 #include <errno.h> 19 #include <string.h> 18 20 extern "C" { 19 21 #include <stdio.h> … … 49 51 thread_desc * mainThread; 50 52 51 struct { __dllist_t(cluster) list; __spinlock_t lock; } global_clusters; 53 extern "C" { 54 struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters; 55 } 52 56 53 57 //----------------------------------------------------------------------------- … … 143 147 runner.proc = &this; 144 148 145 sem_init(&idleLock, 0, 0);149 idleLock{}; 146 150 147 151 start( &this ); … … 149 153 150 154 void ^?{}(processor & this) with( this ){ 151 if( ! do_terminate) {155 if( ! __atomic_load_n(&do_terminate, __ATOMIC_ACQUIRE) ) { 152 156 __cfaabi_dbg_print_safe("Kernel : core %p signaling termination\n", &this); 153 terminate(&this); 154 verify(this.do_terminate); 155 verify( kernelTLS.this_processor != &this); 157 158 __atomic_store_n(&do_terminate, true, __ATOMIC_RELAXED); 159 wake( &this ); 160 156 161 P( terminated ); 157 162 verify( kernelTLS.this_processor != &this); 158 pthread_join( kernel_thread, NULL ); 159 } 160 161 sem_destroy(&idleLock); 163 } 164 165 pthread_join( kernel_thread, NULL ); 162 166 } 163 167 … … 198 202 199 203 thread_desc * readyThread = NULL; 200 for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )204 for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ ) 201 205 { 202 206 readyThread = nextThread( this->cltr ); … … 217 221 else 218 222 { 219 spin(this, &spin_count); 223 // spin(this, &spin_count); 224 halt(this); 220 225 } 221 226 } … … 290 295 } 291 296 292 // Handles spinning logic293 // TODO : find some strategy to put cores to sleep after some time294 void spin(processor * this, unsigned int * spin_count) {295 // (*spin_count)++;296 halt(this);297 }298 299 297 // KERNEL_ONLY 300 298 // Context invoker for processors … … 403 401 unlock( ready_queue_lock ); 404 402 405 if( was_empty) {403 if(was_empty) { 406 404 lock (proc_list_lock __cfaabi_dbg_ctx2); 407 405 if(idles) { 408 wake (idles.head);406 wake_fast(idles.head); 409 407 } 410 408 unlock (proc_list_lock); 411 409 } 410 else if( struct processor * idle = idles.head ) { 411 wake_fast(idle); 412 } 413 412 414 } 413 415 … … 544 546 __cfaabi_dbg_print_safe("Kernel : Starting\n"); 545 547 546 global_clusters.list{ __get };547 global_clusters.lock{};548 __cfa_dbg_global_clusters.list{ __get }; 549 __cfa_dbg_global_clusters.lock{}; 548 550 549 551 // Initialize the main cluster … … 626 628 // When its coroutine terminates, it return control to the mainThread 627 629 // which is currently here 628 mainProcessor->do_terminate = true;630 __atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE); 629 631 returnToKernel(); 632 mainThread->self_cor.state = Halted; 630 633 631 634 // THE SYSTEM IS NOW COMPLETELY STOPPED … … 643 646 ^(mainThread){}; 644 647 645 ^( global_clusters.list){};646 ^( global_clusters.lock){};648 ^(__cfa_dbg_global_clusters.list){}; 649 ^(__cfa_dbg_global_clusters.lock){}; 647 650 648 651 __cfaabi_dbg_print_safe("Kernel : Shutdown complete\n"); … … 654 657 655 658 void halt(processor * this) with( *this ) { 659 // verify( ! __atomic_load_n(&do_terminate, __ATOMIC_SEQ_CST) ); 660 656 661 with( *cltr ) { 657 662 lock (proc_list_lock __cfaabi_dbg_ctx2); … … 663 668 __cfaabi_dbg_print_safe("Kernel : Processor %p ready to sleep\n", this); 664 669 665 verify( ({int sval = 0; sem_getvalue(&this->idleLock, &sval); sval; }) < 200); 666 int __attribute__((unused)) ret = sem_wait(&idleLock); 667 verify(ret > 0 || errno == EINTR); 670 wait( idleLock ); 668 671 669 672 __cfaabi_dbg_print_safe("Kernel : Processor %p woke up and ready to run\n", this); … … 675 678 unlock (proc_list_lock); 676 679 } 677 }678 679 void wake(processor * this) {680 __cfaabi_dbg_print_safe("Kernel : Waking up processor %p\n", this);681 int __attribute__((unused)) ret = sem_post(&this->idleLock);682 verify(ret > 0 || errno == EINTR);683 verify( ({int sval = 0; sem_getvalue(&this->idleLock, &sval); sval; }) < 200);684 680 } 685 681 … … 797 793 // Global Queues 798 794 void doregister( cluster & cltr ) { 799 lock ( global_clusters.lock __cfaabi_dbg_ctx2);800 push_front( global_clusters.list, cltr );801 unlock ( global_clusters.lock );795 lock ( __cfa_dbg_global_clusters.lock __cfaabi_dbg_ctx2); 796 push_front( __cfa_dbg_global_clusters.list, cltr ); 797 unlock ( __cfa_dbg_global_clusters.lock ); 802 798 } 803 799 804 800 void unregister( cluster & cltr ) { 805 lock ( global_clusters.lock __cfaabi_dbg_ctx2);806 remove( global_clusters.list, cltr );807 unlock( global_clusters.lock );801 lock ( __cfa_dbg_global_clusters.lock __cfaabi_dbg_ctx2); 802 remove( __cfa_dbg_global_clusters.list, cltr ); 803 unlock( __cfa_dbg_global_clusters.lock ); 808 804 } 809 805
Note:
See TracChangeset
for help on using the changeset viewer.