Ignore:
Timestamp:
Jun 11, 2020, 6:47:27 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
9b1dcc2
Parents:
61d7bec
Message:

Changed ready RW-Lock to be a single global lock instead of per cluster.
This was needed because otherwise, processors outside the cluster could not schedule threads.

File:
1 edited

Legend:

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

    r61d7bec rb388ee81  
    125125//-----------------------------------------------------------------------------
    126126// Kernel storage
    127 KERNEL_STORAGE(cluster,         mainCluster);
    128 KERNEL_STORAGE(processor,       mainProcessor);
    129 KERNEL_STORAGE($thread, mainThread);
    130 KERNEL_STORAGE(__stack_t,       mainThreadCtx);
    131 
    132 cluster     * mainCluster;
    133 processor   * mainProcessor;
    134 $thread * mainThread;
     127KERNEL_STORAGE(cluster,              mainCluster);
     128KERNEL_STORAGE(processor,            mainProcessor);
     129KERNEL_STORAGE($thread,              mainThread);
     130KERNEL_STORAGE(__stack_t,            mainThreadCtx);
     131KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock);
     132
     133cluster              * mainCluster;
     134processor            * mainProcessor;
     135$thread              * mainThread;
     136__scheduler_RWLock_t * __scheduler_lock;
    135137
    136138extern "C" {
     
    262264        this.preemption_rate = preemption_rate;
    263265        ready_queue{};
    264         ready_lock{};
    265266
    266267        #if !defined(__CFA_NO_STATISTICS__)
     
    299300        // register the processor unless it's the main thread which is handled in the boot sequence
    300301        if(this != mainProcessor) {
    301                 this->id = doregister2(this->cltr, this);
     302                this->id = doregister(this);
    302303                ready_queue_grow( this->cltr );
    303304        }
     
    345346        if(this != mainProcessor) {
    346347                ready_queue_shrink( this->cltr );
    347                 unregister2(this->cltr, this);
     348                unregister(this);
    348349        }
    349350        else {
     
    622623        if (thrd->preempted == __NO_PREEMPTION) thrd->state = Ready;
    623624
    624         ready_schedule_lock(thrd->curr_cluster, kernelTLS.this_processor);
     625        ready_schedule_lock( kernelTLS.this_processor );
    625626                push( thrd->curr_cluster, thrd );
    626627
    627628                __wake_one(thrd->curr_cluster);
    628         ready_schedule_unlock(thrd->curr_cluster, kernelTLS.this_processor);
     629        ready_schedule_unlock( kernelTLS.this_processor );
    629630
    630631        /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     
    635636        /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    636637
    637         ready_schedule_lock(this, kernelTLS.this_processor);
     638        ready_schedule_lock( kernelTLS.this_processor );
    638639                $thread * head = pop( this );
    639         ready_schedule_unlock(this, kernelTLS.this_processor);
     640        ready_schedule_unlock( kernelTLS.this_processor );
    640641
    641642        /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     
    749750        __cfa_dbg_global_clusters.lock{};
    750751
     752        // Initialize the global scheduler lock
     753        __scheduler_lock = (__scheduler_RWLock_t*)&storage___scheduler_lock;
     754        (*__scheduler_lock){};
     755
    751756        // Initialize the main cluster
    752757        mainCluster = (cluster *)&storage_mainCluster;
     
    793798        (*mainProcessor){};
    794799
    795         mainProcessor->id = doregister2(mainCluster, mainProcessor);
     800        mainProcessor->id = doregister(mainProcessor);
    796801
    797802        //initialize the global state variables
     
    848853        kernel_stop_preemption();
    849854
    850         unregister2(mainCluster, mainProcessor);
     855        unregister(mainProcessor);
    851856
    852857        // Destroy the main processor and its context in reverse order of construction
     
    866871
    867872        ^(*mainCluster){};
     873
     874        ^(*__scheduler_lock){};
    868875
    869876        ^(__cfa_dbg_global_clusters.list){};
Note: See TracChangeset for help on using the changeset viewer.