Ignore:
File:
1 edited

Legend:

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

    rb4b63e8 r0190480  
    237237        $coroutine * proc_cor = get_coroutine(this->runner);
    238238
     239        // Update global state
     240        kernelTLS.this_thread = thrd_dst;
     241
    239242        // set state of processor coroutine to inactive
    240243        verify(proc_cor->state == Active);
     
    246249                thrd_dst->state = Active;
    247250
    248                 // Update global state
    249                 kernelTLS.this_thread = thrd_dst;
     251                __cfaabi_dbg_debug_do(
     252                        thrd_dst->park_stale   = true;
     253                        thrd_dst->unpark_stale = true;
     254                )
    250255
    251256                /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    252257                /* paranoid */ verify( kernelTLS.this_thread == thrd_dst );
    253                 /* paranoid */ verify( thrd_dst->context.SP );
    254258                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor
    255259                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor
    256                 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary );
    257 
    258 
    259260
    260261                // set context switch to the thread that the processor is executing
     262                verify( thrd_dst->context.SP );
    261263                __cfactx_switch( &proc_cor->context, &thrd_dst->context );
    262264                // when __cfactx_switch returns we are back in the processor coroutine
    263265
    264                 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary );
    265266                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst );
    266267                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst );
    267                 /* paranoid */ verify( thrd_dst->context.SP );
    268268                /* paranoid */ verify( kernelTLS.this_thread == thrd_dst );
    269269                /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    270270
    271                 // Reset global state
    272                 kernelTLS.this_thread = 0p;
    273271
    274272                // We just finished running a thread, there are a few things that could have happened.
     
    288286                        // The thread has halted, it should never be scheduled/run again
    289287                        // We may need to wake someone up here since
    290                         unpark( this->destroyer );
     288                        unpark( this->destroyer __cfaabi_dbg_ctx2 );
    291289                        this->destroyer = 0p;
    292290                        break RUNNING;
     
    298296                // set state of processor coroutine to active and the thread to inactive
    299297                int old_ticket = __atomic_fetch_sub(&thrd_dst->ticket, 1, __ATOMIC_SEQ_CST);
     298                __cfaabi_dbg_debug_do( thrd_dst->park_result = old_ticket; )
    300299                switch(old_ticket) {
    301300                        case 1:
     
    314313        // Just before returning to the processor, set the processor coroutine to active
    315314        proc_cor->state = Active;
     315        kernelTLS.this_thread = 0p;
    316316
    317317        /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     
    334334                        __x87_store;
    335335                #endif
    336                 /* paranoid */ verify( proc_cor->context.SP );
    337                 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary );
     336                verify( proc_cor->context.SP );
    338337                __cfactx_switch( &thrd_src->context, &proc_cor->context );
    339                 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary );
    340338                #if defined( __i386 ) || defined( __x86_64 )
    341339                        __x87_load;
     
    369367        /* paranoid */ #endif
    370368        /* paranoid */ verifyf( thrd->link.next == 0p, "Expected null got %p", thrd->link.next );
    371         /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd->canary );
    372 
    373369
    374370        if (thrd->preempted == __NO_PREEMPTION) thrd->state = Ready;
     
    407403
    408404// KERNEL ONLY unpark with out disabling interrupts
    409 void __unpark(  struct __processor_id_t * id, $thread * thrd ) {
     405void __unpark(  struct __processor_id_t * id, $thread * thrd __cfaabi_dbg_ctx_param2 ) {
     406        // record activity
     407        __cfaabi_dbg_record_thrd( *thrd, false, caller );
     408
    410409        int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST);
     410        __cfaabi_dbg_debug_do( thrd->unpark_result = old_ticket; thrd->unpark_state = thrd->state; )
    411411        switch(old_ticket) {
    412412                case 1:
     
    426426}
    427427
    428 void unpark( $thread * thrd ) {
     428void unpark( $thread * thrd __cfaabi_dbg_ctx_param2 ) {
    429429        if( !thrd ) return;
    430430
    431431        disable_interrupts();
    432         __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd );
     432        __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd __cfaabi_dbg_ctx_fwd2 );
    433433        enable_interrupts( __cfaabi_dbg_ctx );
    434434}
    435435
    436 void park( void ) {
     436void park( __cfaabi_dbg_ctx_param ) {
    437437        /* paranoid */ verify( kernelTLS.preemption_state.enabled );
    438438        disable_interrupts();
    439439        /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    440440        /* paranoid */ verify( kernelTLS.this_thread->preempted == __NO_PREEMPTION );
     441
     442        // record activity
     443        __cfaabi_dbg_record_thrd( *kernelTLS.this_thread, true, caller );
    441444
    442445        returnToKernel();
     
    518521        disable_interrupts();
    519522                /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    520                 post( this->idle );
     523                bool ret = post( this->idle );
    521524        enable_interrupts( __cfaabi_dbg_ctx );
    522525}
     
    646649                // atomically release spin lock and block
    647650                unlock( lock );
    648                 park();
     651                park( __cfaabi_dbg_ctx );
    649652                return true;
    650653        }
     
    667670
    668671        // make new owner
    669         unpark( thrd );
     672        unpark( thrd __cfaabi_dbg_ctx2 );
    670673
    671674        return thrd != 0p;
     
    678681        count += diff;
    679682        for(release) {
    680                 unpark( pop_head( waiting ) );
     683                unpark( pop_head( waiting ) __cfaabi_dbg_ctx2 );
    681684        }
    682685
     
    694697                        this.prev_thrd = kernelTLS.this_thread;
    695698                }
     699
     700                void __cfaabi_dbg_record_thrd($thread & this, bool park, const char prev_name[]) {
     701                        if(park) {
     702                                this.park_caller   = prev_name;
     703                                this.park_stale    = false;
     704                        }
     705                        else {
     706                                this.unpark_caller = prev_name;
     707                                this.unpark_stale  = false;
     708                        }
     709                }
    696710        }
    697711)
Note: See TracChangeset for help on using the changeset viewer.