- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.cfa (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r431cd4f rec43cf9 113 113 static void __wake_one(cluster * cltr); 114 114 115 static void mark_idle (__cluster_proc_list& idles, processor & proc);116 static void mark_awake(__cluster_proc_list& idles, processor & proc);117 static [unsigned idle, unsigned total, * processor] query _idles( & __cluster_proc_listidles );115 static void push (__cluster_idles & idles, processor & proc); 116 static void remove(__cluster_idles & idles, processor & proc); 117 static [unsigned idle, unsigned total, * processor] query( & __cluster_idles idles ); 118 118 119 119 extern void __cfa_io_start( processor * ); … … 189 189 190 190 // Push self to idle stack 191 mark_idle(this->cltr->procs, * this);191 push(this->cltr->idles, * this); 192 192 193 193 // Confirm the ready-queue is empty … … 195 195 if( readyThread ) { 196 196 // A thread was found, cancel the halt 197 mark_awake(this->cltr->procs, * this);197 remove(this->cltr->idles, * this); 198 198 199 199 #if !defined(__CFA_NO_STATISTICS__) … … 225 225 226 226 // We were woken up, remove self from idle 227 mark_awake(this->cltr->procs, * this);227 remove(this->cltr->idles, * this); 228 228 229 229 // DON'T just proceed, start looking again … … 359 359 #if !defined(__CFA_NO_STATISTICS__) 360 360 __tls_stats()->ready.threads.threads++; 361 __push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", this );362 361 #endif 363 362 // This is case 2, the racy case, someone tried to run this thread before it finished blocking … … 377 376 #if !defined(__CFA_NO_STATISTICS__) 378 377 __tls_stats()->ready.threads.threads--; 379 __push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", this );380 378 #endif 381 379 … … 457 455 if( kernelTLS().this_stats ) { 458 456 __tls_stats()->ready.threads.threads++; 459 __push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", kernelTLS().this_processor );460 457 } 461 458 else { 462 459 __atomic_fetch_add(&cl->stats->ready.threads.threads, 1, __ATOMIC_RELAXED); 463 __push_stat( cl->stats, cl->stats->ready.threads.threads, true, "Cluster", cl );464 460 } 465 461 #endif … … 474 470 475 471 ready_schedule_lock(); 476 $thread * thrd = pop _fast( this );472 $thread * thrd = pop( this ); 477 473 ready_schedule_unlock(); 478 474 … … 617 613 unsigned idle; 618 614 unsigned total; 619 [idle, total, p] = query _idles(this->procs);615 [idle, total, p] = query(this->idles); 620 616 621 617 // If no one is sleeping, we are done … … 654 650 } 655 651 656 static void mark_idle(__cluster_proc_list& this, processor & proc) {652 static void push (__cluster_idles & this, processor & proc) { 657 653 /* paranoid */ verify( ! __preemption_enabled() ); 658 654 lock( this ); 659 655 this.idle++; 660 656 /* paranoid */ verify( this.idle <= this.total ); 661 remove(proc); 662 insert_first(this. idles, proc);657 658 insert_first(this.list, proc); 663 659 unlock( this ); 664 660 /* paranoid */ verify( ! __preemption_enabled() ); 665 661 } 666 662 667 static void mark_awake(__cluster_proc_list& this, processor & proc) {663 static void remove(__cluster_idles & this, processor & proc) { 668 664 /* paranoid */ verify( ! __preemption_enabled() ); 669 665 lock( this ); 670 666 this.idle--; 671 667 /* paranoid */ verify( this.idle >= 0 ); 668 672 669 remove(proc); 673 insert_last(this.actives, proc);674 670 unlock( this ); 675 671 /* paranoid */ verify( ! __preemption_enabled() ); 676 672 } 677 673 678 static [unsigned idle, unsigned total, * processor] query_idles( & __cluster_proc_list this ) { 679 /* paranoid */ verify( ! __preemption_enabled() ); 680 /* paranoid */ verify( ready_schedule_islocked() ); 681 674 static [unsigned idle, unsigned total, * processor] query( & __cluster_idles this ) { 682 675 for() { 683 676 uint64_t l = __atomic_load_n(&this.lock, __ATOMIC_SEQ_CST); … … 685 678 unsigned idle = this.idle; 686 679 unsigned total = this.total; 687 processor * proc = &this. idles`first;680 processor * proc = &this.list`first; 688 681 // Compiler fence is unnecessary, but gcc-8 and older incorrectly reorder code without it 689 682 asm volatile("": : :"memory"); … … 691 684 return [idle, total, proc]; 692 685 } 693 694 /* paranoid */ verify( ready_schedule_islocked() );695 /* paranoid */ verify( ! __preemption_enabled() );696 686 } 697 687
Note:
See TracChangeset
for help on using the changeset viewer.