Ignore:
Timestamp:
Aug 14, 2017, 2:03:39 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
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:
74b007ba
Parents:
fd344aa (diff), 54cd58b (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' into references

File:
1 edited

Legend:

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

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:33:18 2017
     13// Update Count     : 2
    1514//
    1615
     
    4241//-----------------------------------------------------------------------------
    4342// 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);
     43KERNEL_STORAGE(cluster,           mainCluster);
     44KERNEL_STORAGE(processor,         mainProcessor);
     45KERNEL_STORAGE(processorCtx_t,    mainProcessorCtx);
     46KERNEL_STORAGE(thread_desc,       mainThread);
    5047KERNEL_STORAGE(machine_context_t, mainThreadCtx);
    5148
    52 cluster * systemCluster;
    53 system_proc_t * systemProcessor;
     49cluster *     mainCluster;
     50processor *   mainProcessor;
    5451thread_desc * mainThread;
    5552
     
    5754// Global state
    5855
    59 volatile thread_local processor * this_processor;
    60 volatile thread_local coroutine_desc * this_coroutine;
    61 volatile thread_local thread_desc * this_thread;
     56thread_local coroutine_desc * volatile this_coroutine;
     57thread_local thread_desc *    volatile this_thread;
     58thread_local processor *      volatile this_processor;
     59
    6260volatile thread_local bool preemption_in_progress = 0;
    6361volatile thread_local unsigned short disable_preempt_count = 1;
     
    8583
    8684        this.limit = (void *)(((intptr_t)this.base) - this.size);
    87         this.context = &mainThreadCtxStorage;
     85        this.context = &storage_mainThreadCtx;
    8886        this.top = this.base;
    8987}
     
    125123
    126124void ?{}(processor & this) {
    127         this{ systemCluster };
     125        this{ mainCluster };
    128126}
    129127
     
    131129        this.cltr = cltr;
    132130        (this.terminated){ 0 };
    133         this.is_terminated = false;
     131        this.do_terminate = false;
    134132        this.preemption_alarm = NULL;
    135         this.preemption = default_preemption();
    136133        this.pending_preemption = false;
    137134
     
    142139        this.cltr = cltr;
    143140        (this.terminated){ 0 };
    144         this.is_terminated = false;
     141        this.do_terminate = false;
    145142        this.preemption_alarm = NULL;
    146         this.preemption = default_preemption();
    147143        this.pending_preemption = false;
    148144        this.kernel_thread = pthread_self();
    149145
    150146        this.runner = &runner;
    151         LIB_DEBUG_PRINT_SAFE("Kernel : constructing system processor context %p\n", &runner);
     147        LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", &runner);
    152148        runner{ &this };
    153149}
    154150
    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 
    167151void ^?{}(processor & this) {
    168         if( ! this.is_terminated ) {
     152        if( ! this.do_terminate ) {
    169153                LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", &this);
    170                 this.is_terminated = true;
     154                this.do_terminate = true;
    171155                P( &this.terminated );
    172156                pthread_join( this.kernel_thread, NULL );
     
    176160void ?{}(cluster & this) {
    177161        ( this.ready_queue ){};
    178         ( this.lock ){};
     162        ( this.ready_queue_lock ){};
     163
     164        this.preemption = default_preemption();
    179165}
    180166
     
    199185
    200186                thread_desc * readyThread = NULL;
    201                 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )
     187                for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )
    202188                {
    203189                        readyThread = nextThread( this->cltr );
     
    343329        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    344330
    345         lock( &systemProcessor->proc.cltr->lock DEBUG_CTX2 );
    346         append( &systemProcessor->proc.cltr->ready_queue, thrd );
    347         unlock( &systemProcessor->proc.cltr->lock );
     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 );
    348334
    349335        verify( disable_preempt_count > 0 );
     
    352338thread_desc * nextThread(cluster * this) {
    353339        verify( disable_preempt_count > 0 );
    354         lock( &this->lock DEBUG_CTX2 );
     340        lock( &this->ready_queue_lock DEBUG_CTX2 );
    355341        thread_desc * head = pop_head( &this->ready_queue );
    356         unlock( &this->lock );
     342        unlock( &this->ready_queue_lock );
    357343        verify( disable_preempt_count > 0 );
    358344        return head;
     
    452438        // Start by initializing the main thread
    453439        // SKULLDUGGERY: the mainThread steals the process main thread
    454         // which will then be scheduled by the systemProcessor normally
    455         mainThread = (thread_desc *)&mainThreadStorage;
     440        // which will then be scheduled by the mainProcessor normally
     441        mainThread = (thread_desc *)&storage_mainThread;
    456442        current_stack_info_t info;
    457443        (*mainThread){ &info };
     
    459445        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    460446
    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
     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
    468454        // (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);
     455        mainProcessor = (processor *)&storage_mainProcessor;
     456        (*mainProcessor){ mainCluster, *(processorCtx_t *)&storage_mainProcessorCtx };
    475457
    476458        //initialize the global state variables
    477         this_processor = &systemProcessor->proc;
     459        this_processor = mainProcessor;
    478460        this_thread = mainThread;
    479461        this_coroutine = &mainThread->cor;
    480         disable_preempt_count = 1;
    481462
    482463        // Enable preemption
    483464        kernel_start_preemption();
    484465
    485         // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
     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
    486471        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    487472        // mainThread is on the ready queue when this call is made.
    488         resume( *systemProcessor->proc.runner );
     473        resume( *mainProcessor->runner );
    489474
    490475
     
    501486        disable_interrupts();
    502487
    503         // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
     488        // SKULLDUGGERY: Notify the mainProcessor it needs to terminates.
    504489        // When its coroutine terminates, it return control to the mainThread
    505490        // which is currently here
    506         systemProcessor->proc.is_terminated = true;
     491        mainProcessor->do_terminate = true;
    507492        suspend();
    508493
     
    512497        kernel_stop_preemption();
    513498
    514         // Destroy the system processor and its context in reverse order of construction
     499        // Destroy the main processor and its context in reverse order of construction
    515500        // These were manually constructed so we need manually destroy them
    516         ^(*systemProcessor->proc.runner){};
    517         ^(systemProcessor){};
     501        ^(*mainProcessor->runner){};
     502        ^(mainProcessor){};
    518503
    519504        // Final step, destroy the main thread since it is no longer needed
     
    699684        return top;
    700685}
     686
    701687// Local Variables: //
    702688// mode: c //
Note: See TracChangeset for help on using the changeset viewer.