- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r73f4d08 rfc59b580 113 113 static void __wake_one(cluster * cltr); 114 114 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_idlesidles );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_list idles ); 118 118 119 119 extern void __cfa_io_start( processor * ); … … 189 189 190 190 // Push self to idle stack 191 push(this->cltr->idles, * this);191 mark_idle(this->cltr->procs, * 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 remove(this->cltr->idles, * this);197 mark_awake(this->cltr->procs, * this); 198 198 199 199 #if !defined(__CFA_NO_STATISTICS__) … … 225 225 226 226 // We were woken up, remove self from idle 227 remove(this->cltr->idles, * this);227 mark_awake(this->cltr->procs, * this); 228 228 229 229 // DON'T just proceed, start looking again … … 617 617 unsigned idle; 618 618 unsigned total; 619 [idle, total, p] = query (this->idles);619 [idle, total, p] = query_idles(this->procs); 620 620 621 621 // If no one is sleeping, we are done … … 654 654 } 655 655 656 static void push (__cluster_idles& this, processor & proc) {656 static void mark_idle(__cluster_proc_list & this, processor & proc) { 657 657 /* paranoid */ verify( ! __preemption_enabled() ); 658 658 lock( this ); 659 659 this.idle++; 660 660 /* paranoid */ verify( this.idle <= this.total ); 661 662 insert_first(this. list, proc);661 remove(proc); 662 insert_first(this.idles, proc); 663 663 unlock( this ); 664 664 /* paranoid */ verify( ! __preemption_enabled() ); 665 665 } 666 666 667 static void remove(__cluster_idles& this, processor & proc) {667 static void mark_awake(__cluster_proc_list & this, processor & proc) { 668 668 /* paranoid */ verify( ! __preemption_enabled() ); 669 669 lock( this ); 670 670 this.idle--; 671 671 /* paranoid */ verify( this.idle >= 0 ); 672 673 672 remove(proc); 673 insert_last(this.actives, proc); 674 674 unlock( this ); 675 675 /* paranoid */ verify( ! __preemption_enabled() ); 676 676 } 677 677 678 static [unsigned idle, unsigned total, * processor] query( & __cluster_idles this ) { 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 679 682 for() { 680 683 uint64_t l = __atomic_load_n(&this.lock, __ATOMIC_SEQ_CST); … … 682 685 unsigned idle = this.idle; 683 686 unsigned total = this.total; 684 processor * proc = &this. list`first;687 processor * proc = &this.idles`first; 685 688 // Compiler fence is unnecessary, but gcc-8 and older incorrectly reorder code without it 686 689 asm volatile("": : :"memory"); … … 688 691 return [idle, total, proc]; 689 692 } 693 694 /* paranoid */ verify( ready_schedule_islocked() ); 695 /* paranoid */ verify( ! __preemption_enabled() ); 690 696 } 691 697
Note: See TracChangeset
for help on using the changeset viewer.