Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel.cfa

    rec43cf9 r431cd4f  
    113113static void __wake_one(cluster * cltr);
    114114
    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 );
     115static void mark_idle (__cluster_proc_list & idles, processor & proc);
     116static void mark_awake(__cluster_proc_list & idles, processor & proc);
     117static [unsigned idle, unsigned total, * processor] query_idles( & __cluster_proc_list idles );
    118118
    119119extern void __cfa_io_start( processor * );
     
    189189
    190190                                // Push self to idle stack
    191                                 push(this->cltr->idles, * this);
     191                                mark_idle(this->cltr->procs, * this);
    192192
    193193                                // Confirm the ready-queue is empty
     
    195195                                if( readyThread ) {
    196196                                        // A thread was found, cancel the halt
    197                                         remove(this->cltr->idles, * this);
     197                                        mark_awake(this->cltr->procs, * this);
    198198
    199199                                        #if !defined(__CFA_NO_STATISTICS__)
     
    225225
    226226                                // We were woken up, remove self from idle
    227                                 remove(this->cltr->idles, * this);
     227                                mark_awake(this->cltr->procs, * this);
    228228
    229229                                // DON'T just proceed, start looking again
     
    359359                                #if !defined(__CFA_NO_STATISTICS__)
    360360                                        __tls_stats()->ready.threads.threads++;
     361                                        __push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", this );
    361362                                #endif
    362363                                // This is case 2, the racy case, someone tried to run this thread before it finished blocking
     
    376377        #if !defined(__CFA_NO_STATISTICS__)
    377378                __tls_stats()->ready.threads.threads--;
     379                __push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", this );
    378380        #endif
    379381
     
    455457                if( kernelTLS().this_stats ) {
    456458                        __tls_stats()->ready.threads.threads++;
     459                        __push_stat( __tls_stats(), __tls_stats()->ready.threads.threads, false, "Processor", kernelTLS().this_processor );
    457460                }
    458461                else {
    459462                        __atomic_fetch_add(&cl->stats->ready.threads.threads, 1, __ATOMIC_RELAXED);
     463                        __push_stat( cl->stats, cl->stats->ready.threads.threads, true, "Cluster", cl );
    460464                }
    461465        #endif
     
    470474
    471475        ready_schedule_lock();
    472                 $thread * thrd = pop( this );
     476                $thread * thrd = pop_fast( this );
    473477        ready_schedule_unlock();
    474478
     
    613617        unsigned idle;
    614618        unsigned total;
    615         [idle, total, p] = query(this->idles);
     619        [idle, total, p] = query_idles(this->procs);
    616620
    617621        // If no one is sleeping, we are done
     
    650654}
    651655
    652 static void push  (__cluster_idles & this, processor & proc) {
     656static void mark_idle(__cluster_proc_list & this, processor & proc) {
    653657        /* paranoid */ verify( ! __preemption_enabled() );
    654658        lock( this );
    655659                this.idle++;
    656660                /* paranoid */ verify( this.idle <= this.total );
    657 
    658                 insert_first(this.list, proc);
     661                remove(proc);
     662                insert_first(this.idles, proc);
    659663        unlock( this );
    660664        /* paranoid */ verify( ! __preemption_enabled() );
    661665}
    662666
    663 static void remove(__cluster_idles & this, processor & proc) {
     667static void mark_awake(__cluster_proc_list & this, processor & proc) {
    664668        /* paranoid */ verify( ! __preemption_enabled() );
    665669        lock( this );
    666670                this.idle--;
    667671                /* paranoid */ verify( this.idle >= 0 );
    668 
    669672                remove(proc);
     673                insert_last(this.actives, proc);
    670674        unlock( this );
    671675        /* paranoid */ verify( ! __preemption_enabled() );
    672676}
    673677
    674 static [unsigned idle, unsigned total, * processor] query( & __cluster_idles this ) {
     678static [unsigned idle, unsigned total, * processor] query_idles( & __cluster_proc_list this ) {
     679        /* paranoid */ verify( ! __preemption_enabled() );
     680        /* paranoid */ verify( ready_schedule_islocked() );
     681
    675682        for() {
    676683                uint64_t l = __atomic_load_n(&this.lock, __ATOMIC_SEQ_CST);
     
    678685                unsigned idle    = this.idle;
    679686                unsigned total   = this.total;
    680                 processor * proc = &this.list`first;
     687                processor * proc = &this.idles`first;
    681688                // Compiler fence is unnecessary, but gcc-8 and older incorrectly reorder code without it
    682689                asm volatile("": : :"memory");
     
    684691                return [idle, total, proc];
    685692        }
     693
     694        /* paranoid */ verify( ready_schedule_islocked() );
     695        /* paranoid */ verify( ! __preemption_enabled() );
    686696}
    687697
Note: See TracChangeset for help on using the changeset viewer.