Changeset e84ab3d for libcfa/src/concurrency/kernel
- Timestamp:
- Jul 5, 2021, 4:44:20 PM (3 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 7f62b708
- Parents:
- ee23a8d
- Location:
- libcfa/src/concurrency/kernel
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
ree23a8d re84ab3d 24 24 #endif 25 25 26 struct $thread;26 struct thread$; 27 27 struct processor; 28 28 struct cluster; … … 36 36 extern "Cforall" { 37 37 extern __attribute__((aligned(128))) thread_local struct KernelThreadData { 38 struct $thread* volatile this_thread;38 struct thread$ * volatile this_thread; 39 39 struct processor * volatile this_processor; 40 40 volatile bool sched_lock; … … 120 120 extern "Cforall" { 121 121 extern void park( void ); 122 extern void unpark( struct $thread* this );123 static inline struct $thread* active_thread () {124 struct $thread* t = publicTLS_get( this_thread );122 extern void unpark( struct thread$ * this ); 123 static inline struct thread$ * active_thread () { 124 struct thread$ * t = publicTLS_get( this_thread ); 125 125 /* paranoid */ verify( t ); 126 126 return t; … … 144 144 // Semaphore which only supports a single thread 145 145 struct single_sem { 146 struct $thread* volatile ptr;146 struct thread$ * volatile ptr; 147 147 }; 148 148 … … 156 156 bool wait(single_sem & this) { 157 157 for() { 158 struct $thread* expected = this.ptr;158 struct thread$ * expected = this.ptr; 159 159 if(expected == 1p) { 160 160 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { … … 175 175 bool post(single_sem & this) { 176 176 for() { 177 struct $thread* expected = this.ptr;177 struct thread$ * expected = this.ptr; 178 178 if(expected == 1p) return false; 179 179 if(expected == 0p) { … … 200 200 // 1p : fulfilled (wait won't block) 201 201 // any thread : a thread is currently waiting 202 struct $thread* volatile ptr;202 struct thread$ * volatile ptr; 203 203 }; 204 204 … … 214 214 bool wait(oneshot & this) { 215 215 for() { 216 struct $thread* expected = this.ptr;216 struct thread$ * expected = this.ptr; 217 217 if(expected == 1p) return false; 218 218 /* paranoid */ verify( expected == 0p ); … … 227 227 // Mark as fulfilled, wake thread if needed 228 228 // return true if a thread was unparked 229 $thread* post(oneshot & this, bool do_unpark = true) {230 struct $thread* got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST);229 thread$ * post(oneshot & this, bool do_unpark = true) { 230 struct thread$ * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 231 231 if( got == 0p ) return 0p; 232 232 if(do_unpark) unpark( got ); … … 343 343 // from the server side, mark the future as fulfilled 344 344 // delete it if needed 345 $thread* fulfil( future_t & this, bool do_unpark = true ) {345 thread$ * fulfil( future_t & this, bool do_unpark = true ) { 346 346 for() { 347 347 struct oneshot * expected = this.ptr; … … 364 364 if(__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 365 365 if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return 0p; } 366 $thread* ret = post( *expected, do_unpark );366 thread$ * ret = post( *expected, do_unpark ); 367 367 __atomic_store_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 368 368 return ret; -
libcfa/src/concurrency/kernel/startup.cfa
ree23a8d re84ab3d 77 77 static void __kernel_first_resume( processor * this ); 78 78 static void __kernel_last_resume ( processor * this ); 79 static void init(processor & this, const char name[], cluster & _cltr, $thread* initT);79 static void init(processor & this, const char name[], cluster & _cltr, thread$ * initT); 80 80 static void deinit(processor & this); 81 81 static void doregister( struct cluster & cltr ); … … 83 83 static void register_tls( processor * this ); 84 84 static void unregister_tls( processor * this ); 85 static void ?{}( $coroutine& this, current_stack_info_t * info);86 static void ?{}( $thread& this, current_stack_info_t * info);85 static void ?{}( coroutine$ & this, current_stack_info_t * info); 86 static void ?{}( thread$ & this, current_stack_info_t * info); 87 87 static void ?{}(processorCtx_t & this) {} 88 88 static void ?{}(processorCtx_t & this, processor * proc, current_stack_info_t * info); … … 105 105 KERNEL_STORAGE(cluster, mainCluster); 106 106 KERNEL_STORAGE(processor, mainProcessor); 107 KERNEL_STORAGE( $thread, mainThread);107 KERNEL_STORAGE(thread$, mainThread); 108 108 KERNEL_STORAGE(__stack_t, mainThreadCtx); 109 109 KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock); … … 114 114 cluster * mainCluster; 115 115 processor * mainProcessor; 116 $thread* mainThread;116 thread$ * mainThread; 117 117 __scheduler_RWLock_t * __scheduler_lock; 118 118 … … 203 203 // SKULLDUGGERY: the mainThread steals the process main thread 204 204 // which will then be scheduled by the mainProcessor normally 205 mainThread = ( $thread*)&storage_mainThread;205 mainThread = (thread$ *)&storage_mainThread; 206 206 current_stack_info_t info; 207 207 info.storage = (__stack_t*)&storage_mainThreadCtx; … … 397 397 398 398 static void __kernel_first_resume( processor * this ) { 399 $thread* src = mainThread;400 $coroutine* dst = get_coroutine(this->runner);399 thread$ * src = mainThread; 400 coroutine$ * dst = get_coroutine(this->runner); 401 401 402 402 /* paranoid */ verify( ! __preemption_enabled() ); … … 430 430 // KERNEL_ONLY 431 431 static void __kernel_last_resume( processor * this ) { 432 $coroutine* src = &mainThread->self_cor;433 $coroutine* dst = get_coroutine(this->runner);432 coroutine$ * src = &mainThread->self_cor; 433 coroutine$ * dst = get_coroutine(this->runner); 434 434 435 435 /* paranoid */ verify( ! __preemption_enabled() ); … … 459 459 //----------------------------------------------------------------------------- 460 460 // Main thread construction 461 static void ?{}( $coroutine& this, current_stack_info_t * info) with( this ) {461 static void ?{}( coroutine$ & this, current_stack_info_t * info) with( this ) { 462 462 stack.storage = info->storage; 463 463 with(*stack.storage) { … … 474 474 } 475 475 476 static void ?{}( $thread& this, current_stack_info_t * info) with( this ) {476 static void ?{}( thread$ & this, current_stack_info_t * info) with( this ) { 477 477 ticket = TICKET_RUNNING; 478 478 state = Start; … … 506 506 } 507 507 508 static void init(processor & this, const char name[], cluster & _cltr, $thread* initT) with( this ) {508 static void init(processor & this, const char name[], cluster & _cltr, thread$ * initT) with( this ) { 509 509 this.name = name; 510 510 this.cltr = &_cltr; … … 545 545 } 546 546 547 void ?{}(processor & this, const char name[], cluster & _cltr, $thread* initT) {547 void ?{}(processor & this, const char name[], cluster & _cltr, thread$ * initT) { 548 548 ( this.terminated ){}; 549 549 ( this.runner ){}; … … 663 663 } 664 664 665 void doregister( cluster * cltr, $thread& thrd ) {665 void doregister( cluster * cltr, thread$ & thrd ) { 666 666 lock (cltr->thread_list_lock __cfaabi_dbg_ctx2); 667 667 cltr->nthreads += 1; … … 670 670 } 671 671 672 void unregister( cluster * cltr, $thread& thrd ) {672 void unregister( cluster * cltr, thread$ & thrd ) { 673 673 lock (cltr->thread_list_lock __cfaabi_dbg_ctx2); 674 674 remove(cltr->threads, thrd );
Note: See TracChangeset
for help on using the changeset viewer.