Ignore:
File:
1 edited

Legend:

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

    r77e6fcb re15df4c  
    1515//
    1616
    17 //Start and stop routine for the kernel, declared first to make sure they run first
    18 void kernel_startup(void)  __attribute__((constructor(101)));
    19 void kernel_shutdown(void) __attribute__((destructor(101)));
    20 
    2117//Header
    2218#include "kernel"
     
    4339};
    4440
    45 DECL_COROUTINE(processorCtx_t);
     41DECL_COROUTINE(processorCtx_t)
    4642
    4743#define KERNEL_STORAGE(T,X) static char X##_storage[sizeof(T)]
     
    5652processor * systemProcessor;
    5753thread * mainThread;
     54
     55void kernel_startup(void)  __attribute__((constructor(101)));
     56void kernel_shutdown(void) __attribute__((destructor(101)));
    5857
    5958//-----------------------------------------------------------------------------
     
    185184void main(processorCtx_t * ctx);
    186185thread * nextThread(cluster * this);
    187 void scheduleInternal(processor * this, thread * dst);
     186void runThread(processor * this, thread * dst);
    188187void spin(processor * this, unsigned int * spin_count);
    189188
     
    198197
    199198                if(readyThread) {
    200                         scheduleInternal(this, readyThread);
     199                        runThread(this, readyThread);
    201200                        spin_count = 0;
    202201                } else {
     
    210209}
    211210
    212 //Declarations for scheduleInternal
    213 extern void ThreadCtxSwitch(coroutine * src, coroutine * dst);
    214 
    215 // scheduleInternal runs a thread by context switching
    216 // from the processor coroutine to the target thread
    217 void scheduleInternal(processor * this, thread * dst) {
    218         // coroutine * proc_ctx = get_coroutine(this->ctx);
    219         // coroutine * thrd_ctx = get_coroutine(dst);
    220 
    221         // //Update global state
    222         // this->current_thread = dst;
    223 
    224         // // Context Switch to the thread
    225         // ThreadCtxSwitch(proc_ctx, thrd_ctx);
    226         // // when ThreadCtxSwitch returns we are back in the processor coroutine
    227 
     211void runThread(processor * this, thread * dst) {
    228212        coroutine * proc_ctx = get_coroutine(this->ctx);
    229213        coroutine * thrd_ctx = get_coroutine(dst);
    230       thrd_ctx->last = proc_ctx;
    231  
    232       // context switch to specified coroutine
    233       // Which is now the current_coroutine
    234       LIB_DEBUG_PRINTF("Kernel : switching to ctx %p (from %p, current %p)\n", thrd_ctx, proc_ctx, this->current_coroutine);
    235       this->current_thread = dst;
    236       this->current_coroutine = thrd_ctx;
    237       CtxSwitch( proc_ctx->stack.context, thrd_ctx->stack.context );
    238       this->current_coroutine = proc_ctx;
    239       LIB_DEBUG_PRINTF("Kernel : returned from ctx %p (to %p, current %p)\n", thrd_ctx, proc_ctx, this->current_coroutine);
    240  
    241       // when CtxSwitch returns we are back in the processor coroutine
    242 }
    243 
    244 // Handles spinning logic
    245 // TODO : find some strategy to put cores to sleep after some time
     214        thrd_ctx->last = proc_ctx;
     215
     216        // context switch to specified coroutine
     217        // Which is now the current_coroutine
     218        // LIB_DEBUG_PRINTF("Kernel : switching to ctx %p (from %p, current %p)\n", thrd_ctx, proc_ctx, current_coroutine);
     219        this->current_thread = dst;
     220        this->current_coroutine = thrd_ctx;
     221        CtxSwitch( proc_ctx->stack.context, thrd_ctx->stack.context );
     222        this->current_coroutine = proc_ctx;
     223        // LIB_DEBUG_PRINTF("Kernel : returned from ctx %p (to %p, current %p)\n", thrd_ctx, proc_ctx, current_coroutine);
     224
     225        // when CtxSwitch returns we are back in the processor coroutine
     226}
     227
    246228void spin(processor * this, unsigned int * spin_count) {
    247229        (*spin_count)++;
    248230}
    249231
    250 // Context invoker for processors
    251 // This is the entry point for processors (kernel threads)
    252 // It effectively constructs a coroutine by stealing the pthread stack
    253232void * CtxInvokeProcessor(void * arg) {
    254233        processor * proc = (processor *) arg;
     
    262241        processorCtx_t proc_cor_storage = { proc, &info };
    263242
    264         //Set global state
    265243        proc->current_coroutine = &proc->ctx->c;
    266244        proc->current_thread = NULL;
    267245
     246        LIB_DEBUG_PRINTF("Kernel : core %p created (%p)\n", proc, proc->ctx);
     247
     248        // LIB_DEBUG_PRINTF("Kernel : core    base : %p \n", info.base );
     249        // LIB_DEBUG_PRINTF("Kernel : core storage : %p \n", info.storage );
     250        // LIB_DEBUG_PRINTF("Kernel : core    size : %x \n", info.size );
     251        // LIB_DEBUG_PRINTF("Kernel : core   limit : %p \n", info.limit );
     252        // LIB_DEBUG_PRINTF("Kernel : core context : %p \n", info.context );
     253        // LIB_DEBUG_PRINTF("Kernel : core     top : %p \n", info.top );
     254
    268255        //We now have a proper context from which to schedule threads
    269         LIB_DEBUG_PRINTF("Kernel : core %p created (%p)\n", proc, proc->ctx);
    270256
    271257        // SKULLDUGGERY: Since the coroutine doesn't have its own stack, we can't
     
    278264      proc_cor_storage.c.notHalted = false;
    279265
    280         // Main routine of the core returned, the core is now fully terminated
    281266        LIB_DEBUG_PRINTF("Kernel : core %p main ended (%p)\n", proc, proc->ctx);       
    282267
Note: See TracChangeset for help on using the changeset viewer.