Changes in / [caa649b:1feb535f]


Ignore:
Location:
src/libcfa/concurrency
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/kernel

    rcaa649b r1feb535f  
    7979
    8080// Processor
    81 coroutine processorCtx_t {
    82         struct processor * proc;
    83 };
    84 
    8581// Wrapper around kernel threads
    8682struct processor {
    8783        // Main state
    8884        // Coroutine ctx who does keeps the state of the processor
    89         struct processorCtx_t runner;
     85        struct processorCtx_t * runner;
    9086
    9187        // Cluster from which to get threads
  • src/libcfa/concurrency/kernel.c

    rcaa649b r1feb535f  
    124124//-----------------------------------------------------------------------------
    125125// Processor coroutine
    126 void ?{}(processorCtx_t & this) {}
    127126
    128127// Construct the processor context of the main processor
     
    131130        this.__cor.starter = NULL;
    132131        this.proc = proc;
     132        proc->runner = &this;
    133133}
    134134
     
    137137        (this.__cor){ info };
    138138        this.proc = proc;
     139        proc->runner = &this;
    139140}
    140141
     
    149150        preemption_alarm = NULL;
    150151        pending_preemption = false;
    151         runner.proc = &this;
    152152
    153153        start( &this );
     
    161161        pending_preemption = false;
    162162        kernel_thread = pthread_self();
    163         runner.proc = &this;
    164 
     163
     164        this.runner = &runner;
    165165        __cfaabi_dbg_print_safe("Kernel : constructing main processor context %p\n", &runner);
    166166        runner{ &this };
     
    196196void main(processorCtx_t & runner) {
    197197        processor * this = runner.proc;
    198         verify(this);
    199198
    200199        __cfaabi_dbg_print_safe("Kernel : core %p starting\n", this);
     
    242241void runThread(processor * this, thread_desc * dst) {
    243242        assert(dst->curr_cor);
    244         coroutine_desc * proc_cor = get_coroutine(this->runner);
     243        coroutine_desc * proc_cor = get_coroutine(*this->runner);
    245244        coroutine_desc * thrd_cor = dst->curr_cor;
    246245
     
    257256
    258257void returnToKernel() {
    259         coroutine_desc * proc_cor = get_coroutine(this_processor->runner);
     258        coroutine_desc * proc_cor = get_coroutine(*this_processor->runner);
    260259        coroutine_desc * thrd_cor = this_thread->curr_cor = this_coroutine;
    261260        ThreadCtxSwitch(thrd_cor, proc_cor);
     
    318317        machine_context_t ctx;
    319318        info.context = &ctx;
    320         (proc->runner){ proc, &info };
    321 
    322         __cfaabi_dbg_print_safe("Coroutine : created stack %p\n", get_coroutine(proc->runner)->stack.base);
     319        processorCtx_t proc_cor_storage = { proc, &info };
     320
     321        __cfaabi_dbg_print_safe("Coroutine : created stack %p\n", proc_cor_storage.__cor.stack.base);
    323322
    324323        //Set global state
    325         this_coroutine = get_coroutine(proc->runner);
     324        this_coroutine = &proc->runner->__cor;
    326325        this_thread = NULL;
    327326
    328327        //We now have a proper context from which to schedule threads
    329         __cfaabi_dbg_print_safe("Kernel : core %p created (%p, %p)\n", proc, &proc->runner, &ctx);
     328        __cfaabi_dbg_print_safe("Kernel : core %p created (%p, %p)\n", proc, proc->runner, &ctx);
    330329
    331330        // SKULLDUGGERY: Since the coroutine doesn't have its own stack, we can't
     
    333332        // back to here. Instead directly call the main since we already are on the
    334333        // appropriate stack.
    335         get_coroutine(proc->runner)->state = Active;
    336         main( proc->runner );
    337         get_coroutine(proc->runner)->state = Halted;
     334        proc_cor_storage.__cor.state = Active;
     335        main( proc_cor_storage );
     336        proc_cor_storage.__cor.state = Halted;
    338337
    339338        // Main routine of the core returned, the core is now fully terminated
    340         __cfaabi_dbg_print_safe("Kernel : core %p main ended (%p)\n", proc, &proc->runner);
     339        __cfaabi_dbg_print_safe("Kernel : core %p main ended (%p)\n", proc, proc->runner);
    341340
    342341        return NULL;
     
    353352void kernel_first_resume(processor * this) {
    354353        coroutine_desc * src = this_coroutine;
    355         coroutine_desc * dst = get_coroutine(this->runner);
     354        coroutine_desc * dst = get_coroutine(*this->runner);
    356355
    357356        verify( !preemption_state.enabled );
    358357
    359358        create_stack(&dst->stack, dst->stack.size);
    360         CtxStart(&this->runner, CtxInvokeCoroutine);
     359        CtxStart(this->runner, CtxInvokeCoroutine);
    361360
    362361        verify( !preemption_state.enabled );
     
    412411        verify( !preemption_state.enabled );
    413412        lock( ready_queue_lock __cfaabi_dbg_ctx2 );
     413        //TEMP hack to find a bug
     414        if(this_processor != mainProcessor) {
     415                if(ready_queue.head == mainThread) {
     416                        unlock( ready_queue_lock );
     417                        return NULL;
     418                }
     419        }
     420
    414421        thread_desc * head = pop_head( ready_queue );
    415422        unlock( ready_queue_lock );
     
    577584        // Destroy the main processor and its context in reverse order of construction
    578585        // These were manually constructed so we need manually destroy them
    579         ^(mainProcessor->runner){};
     586        ^(*mainProcessor->runner){};
    580587        ^(mainProcessor){};
    581588
  • src/libcfa/concurrency/kernel_private.h

    rcaa649b r1feb535f  
    5252//-----------------------------------------------------------------------------
    5353// Processor
     54coroutine processorCtx_t {
     55        processor * proc;
     56};
     57
    5458void main(processorCtx_t *);
    5559void start(processor * this);
Note: See TracChangeset for help on using the changeset viewer.