Ignore:
Timestamp:
Jul 20, 2017, 2:05:44 PM (7 years ago)
Author:
Andrew Beach <ajbeach@…>
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, resolv-new, with_gc
Children:
c72f9fd
Parents:
d49bfa8 (diff), 8b28a52 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

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

    rd49bfa8 r957453d  
    4242//-----------------------------------------------------------------------------
    4343// Kernel storage
    44 #define KERNEL_STORAGE(T,X) static char X##Storage[sizeof(T)]
    45 
    46 KERNEL_STORAGE(processorCtx_t, systemProcessorCtx);
    47 KERNEL_STORAGE(cluster, systemCluster);
    48 KERNEL_STORAGE(system_proc_t, systemProcessor);
    49 KERNEL_STORAGE(thread_desc, mainThread);
     44KERNEL_STORAGE(cluster,           mainCluster);
     45KERNEL_STORAGE(processor,         mainProcessor);
     46KERNEL_STORAGE(processorCtx_t,    mainProcessorCtx);
     47KERNEL_STORAGE(thread_desc,       mainThread);
    5048KERNEL_STORAGE(machine_context_t, mainThreadCtx);
    5149
    52 cluster * systemCluster;
    53 system_proc_t * systemProcessor;
     50cluster *     mainCluster;
     51processor *   mainProcessor;
    5452thread_desc * mainThread;
    5553
     
    5755// Global state
    5856
    59 volatile thread_local processor * this_processor;
    60 volatile thread_local coroutine_desc * this_coroutine;
    61 volatile thread_local thread_desc * this_thread;
     57thread_local coroutine_desc * volatile this_coroutine;
     58thread_local thread_desc *    volatile this_thread;
     59thread_local processor *      volatile this_processor;
     60
    6261volatile thread_local bool preemption_in_progress = 0;
    6362volatile thread_local unsigned short disable_preempt_count = 1;
     
    8584
    8685        this->limit = (void *)(((intptr_t)this->base) - this->size);
    87         this->context = &mainThreadCtxStorage;
     86        this->context = &storage_mainThreadCtx;
    8887        this->top = this->base;
    8988}
     
    125124
    126125void ?{}(processor * this) {
    127         this{ systemCluster };
     126        this{ mainCluster };
    128127}
    129128
     
    131130        this->cltr = cltr;
    132131        (&this->terminated){ 0 };
    133         this->is_terminated = false;
     132        this->do_terminate = false;
    134133        this->preemption_alarm = NULL;
    135         this->preemption = default_preemption();
    136134        this->pending_preemption = false;
    137135
     
    142140        this->cltr = cltr;
    143141        (&this->terminated){ 0 };
    144         this->is_terminated = false;
     142        this->do_terminate = false;
    145143        this->preemption_alarm = NULL;
    146         this->preemption = default_preemption();
    147144        this->pending_preemption = false;
    148145        this->kernel_thread = pthread_self();
    149146
    150147        this->runner = runner;
    151         LIB_DEBUG_PRINT_SAFE("Kernel : constructing system processor context %p\n", runner);
     148        LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", runner);
    152149        runner{ this };
    153150}
    154151
    155 LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
    156 
    157 void ?{}(system_proc_t * this, cluster * cltr, processorCtx_t * runner) {
    158         (&this->alarms){};
    159         (&this->alarm_lock){};
    160         this->pending_alarm = false;
    161 
    162         (&this->proc){ cltr, runner };
    163 
    164         verify( validate( &this->alarms ) );
    165 }
    166 
    167152void ^?{}(processor * this) {
    168         if( ! this->is_terminated ) {
     153        if( ! this->do_terminate ) {
    169154                LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", this);
    170                 this->is_terminated = true;
     155                this->do_terminate = true;
    171156                P( &this->terminated );
    172157                pthread_join( this->kernel_thread, NULL );
     
    176161void ?{}(cluster * this) {
    177162        ( &this->ready_queue ){};
    178         ( &this->lock ){};
     163        ( &this->ready_queue_lock ){};
     164
     165        this->preemption = default_preemption();
    179166}
    180167
     
    199186
    200187                thread_desc * readyThread = NULL;
    201                 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )
     188                for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )
    202189                {
    203190                        readyThread = nextThread( this->cltr );
     
    343330        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    344331
    345         lock( &systemProcessor->proc.cltr->lock DEBUG_CTX2 );
    346         append( &systemProcessor->proc.cltr->ready_queue, thrd );
    347         unlock( &systemProcessor->proc.cltr->lock );
     332        lock(   &this_processor->cltr->ready_queue_lock DEBUG_CTX2 );
     333        append( &this_processor->cltr->ready_queue, thrd );
     334        unlock( &this_processor->cltr->ready_queue_lock );
    348335
    349336        verify( disable_preempt_count > 0 );
     
    352339thread_desc * nextThread(cluster * this) {
    353340        verify( disable_preempt_count > 0 );
    354         lock( &this->lock DEBUG_CTX2 );
     341        lock( &this->ready_queue_lock DEBUG_CTX2 );
    355342        thread_desc * head = pop_head( &this->ready_queue );
    356         unlock( &this->lock );
     343        unlock( &this->ready_queue_lock );
    357344        verify( disable_preempt_count > 0 );
    358345        return head;
     
    452439        // Start by initializing the main thread
    453440        // SKULLDUGGERY: the mainThread steals the process main thread
    454         // which will then be scheduled by the systemProcessor normally
    455         mainThread = (thread_desc *)&mainThreadStorage;
     441        // which will then be scheduled by the mainProcessor normally
     442        mainThread = (thread_desc *)&storage_mainThread;
    456443        current_stack_info_t info;
    457444        mainThread{ &info };
     
    459446        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    460447
    461         // Initialize the system cluster
    462         systemCluster = (cluster *)&systemClusterStorage;
    463         systemCluster{};
    464 
    465         LIB_DEBUG_PRINT_SAFE("Kernel : System cluster ready\n");
    466 
    467         // Initialize the system processor and the system processor ctx
     448        // Initialize the main cluster
     449        mainCluster = (cluster *)&storage_mainCluster;
     450        mainCluster{};
     451
     452        LIB_DEBUG_PRINT_SAFE("Kernel : main cluster ready\n");
     453
     454        // Initialize the main processor and the main processor ctx
    468455        // (the coroutine that contains the processing control flow)
    469         systemProcessor = (system_proc_t *)&systemProcessorStorage;
    470         systemProcessor{ systemCluster, (processorCtx_t *)&systemProcessorCtxStorage };
    471 
    472         // Add the main thread to the ready queue
    473         // once resume is called on systemProcessor->runner the mainThread needs to be scheduled like any normal thread
    474         ScheduleThread(mainThread);
     456        mainProcessor = (processor *)&storage_mainProcessor;
     457        mainProcessor{ mainCluster, (processorCtx_t *)&storage_mainProcessorCtx };
    475458
    476459        //initialize the global state variables
    477         this_processor = &systemProcessor->proc;
     460        this_processor = mainProcessor;
    478461        this_thread = mainThread;
    479462        this_coroutine = &mainThread->cor;
    480         disable_preempt_count = 1;
    481463
    482464        // Enable preemption
    483465        kernel_start_preemption();
    484466
    485         // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
     467        // Add the main thread to the ready queue
     468        // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
     469        ScheduleThread(mainThread);
     470
     471        // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX
    486472        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    487473        // mainThread is on the ready queue when this call is made.
    488         resume( systemProcessor->proc.runner );
     474        resume( mainProcessor->runner );
    489475
    490476
     
    501487        disable_interrupts();
    502488
    503         // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
     489        // SKULLDUGGERY: Notify the mainProcessor it needs to terminates.
    504490        // When its coroutine terminates, it return control to the mainThread
    505491        // which is currently here
    506         systemProcessor->proc.is_terminated = true;
     492        mainProcessor->do_terminate = true;
    507493        suspend();
    508494
     
    512498        kernel_stop_preemption();
    513499
    514         // Destroy the system processor and its context in reverse order of construction
     500        // Destroy the main processor and its context in reverse order of construction
    515501        // These were manually constructed so we need manually destroy them
    516         ^(systemProcessor->proc.runner){};
    517         ^(systemProcessor){};
     502        ^(mainProcessor->runner){};
     503        ^(mainProcessor){};
    518504
    519505        // Final step, destroy the main thread since it is no longer needed
Note: See TracChangeset for help on using the changeset viewer.