Changes in src/libcfa/concurrency/kernel.c [b158d8f:65deb18]
- File:
-
- 1 edited
-
src/libcfa/concurrency/kernel.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
rb158d8f r65deb18 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Dec 8 16:23:33201713 // Update Count : 312 // Last Modified On : Fri Jul 21 22:33:18 2017 13 // Update Count : 2 14 14 // 15 15 16 16 //C Includes 17 17 #include <stddef.h> 18 #define ftype `ftype`19 18 extern "C" { 20 19 #include <stdio.h> … … 24 23 #include <unistd.h> 25 24 } 26 #undef ftype27 25 28 26 //CFA Includes … … 87 85 } 88 86 89 void ?{}( coStack_t & this, current_stack_info_t * info) {90 this.size= info->size;91 this.storage= info->storage;92 this.limit= info->limit;93 this.base= info->base;94 this.context= info->context;95 t his.top= info->top;96 this.userStack = true;97 } 98 99 void ?{}( coroutine_desc & this, current_stack_info_t * info) {100 (this.stack){ info };101 this.name = "Main Thread";102 this.errno_ = 0;103 this.state = Start;104 this.starter = NULL;105 } 106 107 void ?{}( thread_desc & this, current_stack_info_t * info) {108 (this.self_cor){ info };87 void ?{}( coStack_t & this, current_stack_info_t * info) with( this ) { 88 size = info->size; 89 storage = info->storage; 90 limit = info->limit; 91 base = info->base; 92 context = info->context; 93 top = info->top; 94 userStack = true; 95 } 96 97 void ?{}( coroutine_desc & this, current_stack_info_t * info) with( this ) { 98 stack{ info }; 99 name = "Main Thread"; 100 errno_ = 0; 101 state = Start; 102 starter = NULL; 103 } 104 105 void ?{}( thread_desc & this, current_stack_info_t * info) with( this ) { 106 self_cor{ info }; 109 107 } 110 108 … … 133 131 void ?{}(processor & this, cluster * cltr) { 134 132 this.cltr = cltr; 135 (this.terminated){ 0 };133 this.terminated{ 0 }; 136 134 this.do_terminate = false; 137 135 this.preemption_alarm = NULL; … … 143 141 void ?{}(processor & this, cluster * cltr, processorCtx_t & runner) { 144 142 this.cltr = cltr; 145 (this.terminated){ 0 };143 this.terminated{ 0 }; 146 144 this.do_terminate = false; 147 145 this.preemption_alarm = NULL; … … 154 152 } 155 153 156 void ^?{}(processor & this) {157 if( ! this.do_terminate ) {154 void ^?{}(processor & this) with( this ){ 155 if( ! do_terminate ) { 158 156 __cfaabi_dbg_print_safe("Kernel : core %p signaling termination\n", &this); 159 this.do_terminate = true;160 P( t his.terminated );161 pthread_join( this.kernel_thread, NULL );162 } 163 } 164 165 void ?{}(cluster & this) {166 (this.ready_queue){};167 ( this.ready_queue_lock ){};168 169 this.preemption = default_preemption();157 do_terminate = true; 158 P( terminated ); 159 pthread_join( kernel_thread, NULL ); 160 } 161 } 162 163 void ?{}(cluster & this) with( this ) { 164 ready_queue{}; 165 ready_queue_lock{}; 166 167 preemption = default_preemption(); 170 168 } 171 169 … … 240 238 // Once a thread has finished running, some of 241 239 // its final actions must be executed from the kernel 242 void finishRunning(processor * this) {243 if( this->finish.action_code == Release ) {244 unlock( * this->finish.lock );245 } 246 else if( this->finish.action_code == Schedule ) {247 ScheduleThread( th is->finish.thrd );248 } 249 else if( this->finish.action_code == Release_Schedule ) {250 unlock( * this->finish.lock );251 ScheduleThread( th is->finish.thrd );252 } 253 else if( this->finish.action_code == Release_Multi ) {254 for(int i = 0; i < this->finish.lock_count; i++) {255 unlock( * this->finish.locks[i] );240 void finishRunning(processor * this) with( this->finish ) { 241 if( action_code == Release ) { 242 unlock( *lock ); 243 } 244 else if( action_code == Schedule ) { 245 ScheduleThread( thrd ); 246 } 247 else if( action_code == Release_Schedule ) { 248 unlock( *lock ); 249 ScheduleThread( thrd ); 250 } 251 else if( action_code == Release_Multi ) { 252 for(int i = 0; i < lock_count; i++) { 253 unlock( *locks[i] ); 256 254 } 257 255 } 258 else if( this->finish.action_code == Release_Multi_Schedule ) {259 for(int i = 0; i < this->finish.lock_count; i++) {260 unlock( * this->finish.locks[i] );256 else if( action_code == Release_Multi_Schedule ) { 257 for(int i = 0; i < lock_count; i++) { 258 unlock( *locks[i] ); 261 259 } 262 for(int i = 0; i < th is->finish.thrd_count; i++) {263 ScheduleThread( th is->finish.thrds[i] );260 for(int i = 0; i < thrd_count; i++) { 261 ScheduleThread( thrds[i] ); 264 262 } 265 263 } 266 264 else { 267 assert( this->finish.action_code == No_Action);265 assert(action_code == No_Action); 268 266 } 269 267 } … … 334 332 verifyf( thrd->next == NULL, "Expected null got %p", thrd->next ); 335 333 336 lock( this_processor->cltr->ready_queue_lock __cfaabi_dbg_ctx2 ); 337 append( this_processor->cltr->ready_queue, thrd ); 338 unlock( this_processor->cltr->ready_queue_lock ); 339 340 verify( disable_preempt_count > 0 ); 341 } 342 343 thread_desc * nextThread(cluster * this) { 344 verify( disable_preempt_count > 0 ); 345 lock( this->ready_queue_lock __cfaabi_dbg_ctx2 ); 346 thread_desc * head = pop_head( this->ready_queue ); 347 unlock( this->ready_queue_lock ); 334 with( *this_processor->cltr ) { 335 lock ( ready_queue_lock __cfaabi_dbg_ctx2 ); 336 append( ready_queue, thrd ); 337 unlock( ready_queue_lock ); 338 } 339 340 verify( disable_preempt_count > 0 ); 341 } 342 343 thread_desc * nextThread(cluster * this) with( *this ) { 344 verify( disable_preempt_count > 0 ); 345 lock( ready_queue_lock __cfaabi_dbg_ctx2 ); 346 thread_desc * head = pop_head( ready_queue ); 347 unlock( ready_queue_lock ); 348 348 verify( disable_preempt_count > 0 ); 349 349 return head; … … 361 361 disable_interrupts(); 362 362 this_processor->finish.action_code = Release; 363 this_processor->finish.lock = lock;363 this_processor->finish.lock = lock; 364 364 365 365 verify( disable_preempt_count > 0 ); … … 371 371 372 372 void BlockInternal( thread_desc * thrd ) { 373 assert(thrd);374 373 disable_interrupts(); 375 assert( thrd->self_cor.state != Halted );376 374 this_processor->finish.action_code = Schedule; 377 this_processor->finish.thrd = thrd;375 this_processor->finish.thrd = thrd; 378 376 379 377 verify( disable_preempt_count > 0 ); … … 388 386 disable_interrupts(); 389 387 this_processor->finish.action_code = Release_Schedule; 390 this_processor->finish.lock = lock;391 this_processor->finish.thrd = thrd;388 this_processor->finish.lock = lock; 389 this_processor->finish.thrd = thrd; 392 390 393 391 verify( disable_preempt_count > 0 ); … … 401 399 disable_interrupts(); 402 400 this_processor->finish.action_code = Release_Multi; 403 this_processor->finish.locks = locks;404 this_processor->finish.lock_count = count;401 this_processor->finish.locks = locks; 402 this_processor->finish.lock_count = count; 405 403 406 404 verify( disable_preempt_count > 0 ); … … 414 412 disable_interrupts(); 415 413 this_processor->finish.action_code = Release_Multi_Schedule; 416 this_processor->finish.locks = locks;417 this_processor->finish.lock_count = lock_count;418 this_processor->finish.thrds = thrds;419 this_processor->finish.thrd_count = thrd_count;414 this_processor->finish.locks = locks; 415 this_processor->finish.lock_count = lock_count; 416 this_processor->finish.thrds = thrds; 417 this_processor->finish.thrd_count = thrd_count; 420 418 421 419 verify( disable_preempt_count > 0 ); … … 429 427 verify( disable_preempt_count > 0 ); 430 428 this_processor->finish.action_code = thrd ? Release_Schedule : Release; 431 this_processor->finish.lock = lock;432 this_processor->finish.thrd = thrd;429 this_processor->finish.lock = lock; 430 this_processor->finish.thrd = thrd; 433 431 434 432 suspend(); … … 581 579 void ^?{}(semaphore & this) {} 582 580 583 void P(semaphore & this) {584 lock( this.lock __cfaabi_dbg_ctx2 );585 this.count -= 1;586 if ( this.count < 0 ) {581 void P(semaphore & this) with( this ){ 582 lock( lock __cfaabi_dbg_ctx2 ); 583 count -= 1; 584 if ( count < 0 ) { 587 585 // queue current task 588 append( this.waiting, (thread_desc *)this_thread );586 append( waiting, (thread_desc *)this_thread ); 589 587 590 588 // atomically release spin lock and block 591 BlockInternal( & this.lock );589 BlockInternal( &lock ); 592 590 } 593 591 else { 594 unlock( this.lock );595 } 596 } 597 598 void V(semaphore & this) {592 unlock( lock ); 593 } 594 } 595 596 void V(semaphore & this) with( this ) { 599 597 thread_desc * thrd = NULL; 600 lock( this.lock __cfaabi_dbg_ctx2 );601 this.count += 1;602 if ( this.count <= 0 ) {598 lock( lock __cfaabi_dbg_ctx2 ); 599 count += 1; 600 if ( count <= 0 ) { 603 601 // remove task at head of waiting list 604 thrd = pop_head( this.waiting );605 } 606 607 unlock( this.lock );602 thrd = pop_head( waiting ); 603 } 604 605 unlock( lock ); 608 606 609 607 // make new owner
Note:
See TracChangeset
for help on using the changeset viewer.