Ignore:
File:
1 edited

Legend:

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

    r6b0b624 rf2b12406  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:33:18 2017
    13 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    4142//-----------------------------------------------------------------------------
    4243// Kernel storage
    43 KERNEL_STORAGE(cluster,           mainCluster);
    44 KERNEL_STORAGE(processor,         mainProcessor);
    45 KERNEL_STORAGE(processorCtx_t,    mainProcessorCtx);
    46 KERNEL_STORAGE(thread_desc,       mainThread);
     44#define KERNEL_STORAGE(T,X) static char X##Storage[sizeof(T)]
     45
     46KERNEL_STORAGE(processorCtx_t, systemProcessorCtx);
     47KERNEL_STORAGE(cluster, systemCluster);
     48KERNEL_STORAGE(system_proc_t, systemProcessor);
     49KERNEL_STORAGE(thread_desc, mainThread);
    4750KERNEL_STORAGE(machine_context_t, mainThreadCtx);
    4851
    49 cluster *     mainCluster;
    50 processor *   mainProcessor;
     52cluster * systemCluster;
     53system_proc_t * systemProcessor;
    5154thread_desc * mainThread;
    5255
     
    5457// Global state
    5558
    56 thread_local coroutine_desc * volatile this_coroutine;
    57 thread_local thread_desc *    volatile this_thread;
    58 thread_local processor *      volatile this_processor;
    59 
    60 volatile thread_local bool preemption_in_progress = 0;
     59volatile thread_local processor * this_processor;
     60volatile thread_local coroutine_desc * this_coroutine;
     61volatile thread_local thread_desc * this_thread;
    6162volatile thread_local unsigned short disable_preempt_count = 1;
    6263
     
    8384
    8485        this->limit = (void *)(((intptr_t)this->base) - this->size);
    85         this->context = &storage_mainThreadCtx;
     86        this->context = &mainThreadCtxStorage;
    8687        this->top = this->base;
    8788}
     
    123124
    124125void ?{}(processor * this) {
    125         this{ mainCluster };
     126        this{ systemCluster };
    126127}
    127128
     
    129130        this->cltr = cltr;
    130131        (&this->terminated){ 0 };
    131         this->do_terminate = false;
     132        this->is_terminated = false;
    132133        this->preemption_alarm = NULL;
     134        this->preemption = default_preemption();
    133135        this->pending_preemption = false;
    134136
     
    139141        this->cltr = cltr;
    140142        (&this->terminated){ 0 };
    141         this->do_terminate = false;
     143        this->is_terminated = false;
    142144        this->preemption_alarm = NULL;
     145        this->preemption = default_preemption();
    143146        this->pending_preemption = false;
    144147        this->kernel_thread = pthread_self();
    145148
    146149        this->runner = runner;
    147         LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", runner);
     150        LIB_DEBUG_PRINT_SAFE("Kernel : constructing system processor context %p\n", runner);
    148151        runner{ this };
    149152}
    150153
     154LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
     155
     156void ?{}(system_proc_t * this, cluster * cltr, processorCtx_t * runner) {
     157        (&this->alarms){};
     158        (&this->alarm_lock){};
     159        this->pending_alarm = false;
     160
     161        (&this->proc){ cltr, runner };
     162
     163        verify( validate( &this->alarms ) );
     164}
     165
    151166void ^?{}(processor * this) {
    152         if( ! this->do_terminate ) {
     167        if( ! this->is_terminated ) {
    153168                LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", this);
    154                 this->do_terminate = true;
     169                this->is_terminated = true;
    155170                P( &this->terminated );
    156171                pthread_join( this->kernel_thread, NULL );
     
    160175void ?{}(cluster * this) {
    161176        ( &this->ready_queue ){};
    162         ( &this->ready_queue_lock ){};
    163 
    164         this->preemption = default_preemption();
     177        ( &this->lock ){};
    165178}
    166179
     
    185198
    186199                thread_desc * readyThread = NULL;
    187                 for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )
     200                for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )
    188201                {
    189202                        readyThread = nextThread( this->cltr );
     
    329342        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    330343
    331         lock(   &this_processor->cltr->ready_queue_lock DEBUG_CTX2 );
    332         append( &this_processor->cltr->ready_queue, thrd );
    333         unlock( &this_processor->cltr->ready_queue_lock );
     344        lock( &systemProcessor->proc.cltr->lock DEBUG_CTX2 );
     345        append( &systemProcessor->proc.cltr->ready_queue, thrd );
     346        unlock( &systemProcessor->proc.cltr->lock );
    334347
    335348        verify( disable_preempt_count > 0 );
     
    338351thread_desc * nextThread(cluster * this) {
    339352        verify( disable_preempt_count > 0 );
    340         lock( &this->ready_queue_lock DEBUG_CTX2 );
     353        lock( &this->lock DEBUG_CTX2 );
    341354        thread_desc * head = pop_head( &this->ready_queue );
    342         unlock( &this->ready_queue_lock );
     355        unlock( &this->lock );
    343356        verify( disable_preempt_count > 0 );
    344357        return head;
     
    438451        // Start by initializing the main thread
    439452        // SKULLDUGGERY: the mainThread steals the process main thread
    440         // which will then be scheduled by the mainProcessor normally
    441         mainThread = (thread_desc *)&storage_mainThread;
     453        // which will then be scheduled by the systemProcessor normally
     454        mainThread = (thread_desc *)&mainThreadStorage;
    442455        current_stack_info_t info;
    443456        mainThread{ &info };
     
    445458        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    446459
    447         // Initialize the main cluster
    448         mainCluster = (cluster *)&storage_mainCluster;
    449         mainCluster{};
    450 
    451         LIB_DEBUG_PRINT_SAFE("Kernel : main cluster ready\n");
    452 
    453         // Initialize the main processor and the main processor ctx
     460        // Initialize the system cluster
     461        systemCluster = (cluster *)&systemClusterStorage;
     462        systemCluster{};
     463
     464        LIB_DEBUG_PRINT_SAFE("Kernel : System cluster ready\n");
     465
     466        // Initialize the system processor and the system processor ctx
    454467        // (the coroutine that contains the processing control flow)
    455         mainProcessor = (processor *)&storage_mainProcessor;
    456         mainProcessor{ mainCluster, (processorCtx_t *)&storage_mainProcessorCtx };
     468        systemProcessor = (system_proc_t *)&systemProcessorStorage;
     469        systemProcessor{ systemCluster, (processorCtx_t *)&systemProcessorCtxStorage };
     470
     471        // Add the main thread to the ready queue
     472        // once resume is called on systemProcessor->runner the mainThread needs to be scheduled like any normal thread
     473        ScheduleThread(mainThread);
    457474
    458475        //initialize the global state variables
    459         this_processor = mainProcessor;
     476        this_processor = &systemProcessor->proc;
    460477        this_thread = mainThread;
    461478        this_coroutine = &mainThread->cor;
     479        disable_preempt_count = 1;
    462480
    463481        // Enable preemption
    464482        kernel_start_preemption();
    465483
    466         // Add the main thread to the ready queue
    467         // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
    468         ScheduleThread(mainThread);
    469 
    470         // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX
     484        // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
    471485        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    472486        // mainThread is on the ready queue when this call is made.
    473         resume( mainProcessor->runner );
     487        resume( systemProcessor->proc.runner );
    474488
    475489
     
    486500        disable_interrupts();
    487501
    488         // SKULLDUGGERY: Notify the mainProcessor it needs to terminates.
     502        // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
    489503        // When its coroutine terminates, it return control to the mainThread
    490504        // which is currently here
    491         mainProcessor->do_terminate = true;
     505        systemProcessor->proc.is_terminated = true;
    492506        suspend();
    493507
     
    497511        kernel_stop_preemption();
    498512
    499         // Destroy the main processor and its context in reverse order of construction
     513        // Destroy the system processor and its context in reverse order of construction
    500514        // These were manually constructed so we need manually destroy them
    501         ^(mainProcessor->runner){};
    502         ^(mainProcessor){};
     515        ^(systemProcessor->proc.runner){};
     516        ^(systemProcessor){};
    503517
    504518        // Final step, destroy the main thread since it is no longer needed
     
    684698        return top;
    685699}
    686 
    687700// Local Variables: //
    688701// mode: c //
Note: See TracChangeset for help on using the changeset viewer.