Ignore:
Timestamp:
May 30, 2018, 5:57:35 PM (6 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
Children:
ae32d96
Parents:
8cc7dd1
Message:

Added basic core quiescing

File:
1 edited

Legend:

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

    r8cc7dd1 r6b4cdd3  
    143143        runner.proc = &this;
    144144
     145        sem_init(&idleLock, 0, 0);
     146
    145147        start( &this );
    146148}
     
    156158                pthread_join( kernel_thread, NULL );
    157159        }
     160
     161        sem_destroy(&idleLock);
    158162}
    159163
     
    289293// TODO : find some strategy to put cores to sleep after some time
    290294void spin(processor * this, unsigned int * spin_count) {
    291         (*spin_count)++;
     295        // (*spin_count)++;
     296        halt(this);
    292297}
    293298
     
    394399        with( *thrd->curr_cluster ) {
    395400                lock  ( ready_queue_lock __cfaabi_dbg_ctx2 );
     401                bool was_empty = !(ready_queue != 0);
    396402                append( ready_queue, thrd );
    397403                unlock( ready_queue_lock );
     404
     405                if( was_empty ) {
     406                        lock      (proc_list_lock __cfaabi_dbg_ctx2);
     407                        if(idles) {
     408                                wake(idles.head);
     409                        }
     410                        unlock    (proc_list_lock);
     411                }
    398412        }
    399413
     
    639653//=============================================================================================
    640654
    641 // void halt(processor * this) with( this ) {
    642 //      pthread_mutex_lock( &idle.lock );
    643 
    644 
    645 
    646 //      // SKULLDUGGERY: Even if spurious wake-up is a thing
    647 //      // spuriously waking up a kernel thread is not a big deal
    648 //      // if it is very rare.
    649 //      pthread_cond_wait( &idle.cond, &idle.lock);
    650 //      pthread_mutex_unlock( &idle.lock );
    651 // }
    652 
    653 // void wake(processor * this) with( this ) {
    654 //      pthread_mutex_lock  (&idle.lock);
    655 //      pthread_cond_signal (&idle.cond);
    656 //      pthread_mutex_unlock(&idle.lock);
    657 // }
     655void halt(processor * this) with( *this ) {
     656        with( *cltr ) {
     657                lock      (proc_list_lock __cfaabi_dbg_ctx2);
     658                remove    (procs, *this);
     659                push_front(idles, *this);
     660                unlock    (proc_list_lock);
     661        }
     662
     663        __cfaabi_dbg_print_safe("Kernel : Processor %p ready to sleep\n", this);
     664
     665        sem_wait(&idleLock);
     666
     667        __cfaabi_dbg_print_safe("Kernel : Processor %p woke up and ready to run\n", this);
     668
     669        with( *cltr ) {
     670                lock      (proc_list_lock __cfaabi_dbg_ctx2);
     671                remove    (idles, *this);
     672                push_front(procs, *this);
     673                unlock    (proc_list_lock);
     674        }
     675}
     676
     677void wake(processor * this) {
     678        __cfaabi_dbg_print_safe("Kernel : Waking up processor %p\n", this);
     679        sem_post(&this->idleLock);
     680}
    658681
    659682//=============================================================================================
Note: See TracChangeset for help on using the changeset viewer.