Ignore:
File:
1 edited

Legend:

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

    rb4b63e8 r58d64a4  
    246246                thrd_dst->state = Active;
    247247
     248                __cfaabi_dbg_debug_do(
     249                        thrd_dst->park_stale   = true;
     250                        thrd_dst->unpark_stale = true;
     251                )
    248252                // Update global state
    249253                kernelTLS.this_thread = thrd_dst;
     
    251255                /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    252256                /* paranoid */ verify( kernelTLS.this_thread == thrd_dst );
    253                 /* paranoid */ verify( thrd_dst->context.SP );
    254257                /* 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
    255258                /* 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 
    258259
    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 );
     
    288288                        // The thread has halted, it should never be scheduled/run again
    289289                        // We may need to wake someone up here since
    290                         unpark( this->destroyer );
     290                        unpark( this->destroyer __cfaabi_dbg_ctx2 );
    291291                        this->destroyer = 0p;
    292292                        break RUNNING;
     
    298298                // set state of processor coroutine to active and the thread to inactive
    299299                int old_ticket = __atomic_fetch_sub(&thrd_dst->ticket, 1, __ATOMIC_SEQ_CST);
     300                __cfaabi_dbg_debug_do( thrd_dst->park_result = old_ticket; )
    300301                switch(old_ticket) {
    301302                        case 1:
     
    334335                        __x87_store;
    335336                #endif
    336                 /* paranoid */ verify( proc_cor->context.SP );
    337                 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary );
     337                verify( proc_cor->context.SP );
    338338                __cfactx_switch( &thrd_src->context, &proc_cor->context );
    339                 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary );
    340339                #if defined( __i386 ) || defined( __x86_64 )
    341340                        __x87_load;
     
    369368        /* paranoid */ #endif
    370369        /* paranoid */ verifyf( thrd->link.next == 0p, "Expected null got %p", thrd->link.next );
    371         /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd->canary );
    372 
    373370
    374371        if (thrd->preempted == __NO_PREEMPTION) thrd->state = Ready;
     
    407404
    408405// KERNEL ONLY unpark with out disabling interrupts
    409 void __unpark(  struct __processor_id_t * id, $thread * thrd ) {
     406void __unpark(  struct __processor_id_t * id, $thread * thrd __cfaabi_dbg_ctx_param2 ) {
     407        // record activity
     408        __cfaabi_dbg_record_thrd( *thrd, false, caller );
     409
    410410        int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST);
     411        __cfaabi_dbg_debug_do( thrd->unpark_result = old_ticket; thrd->unpark_state = thrd->state; )
    411412        switch(old_ticket) {
    412413                case 1:
     
    426427}
    427428
    428 void unpark( $thread * thrd ) {
     429void unpark( $thread * thrd __cfaabi_dbg_ctx_param2 ) {
    429430        if( !thrd ) return;
    430431
    431432        disable_interrupts();
    432         __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd );
     433        __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd __cfaabi_dbg_ctx_fwd2 );
    433434        enable_interrupts( __cfaabi_dbg_ctx );
    434435}
    435436
    436 void park( void ) {
     437void park( __cfaabi_dbg_ctx_param ) {
    437438        /* paranoid */ verify( kernelTLS.preemption_state.enabled );
    438439        disable_interrupts();
    439440        /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    440441        /* paranoid */ verify( kernelTLS.this_thread->preempted == __NO_PREEMPTION );
     442
     443        // record activity
     444        __cfaabi_dbg_record_thrd( *kernelTLS.this_thread, true, caller );
    441445
    442446        returnToKernel();
     
    646650                // atomically release spin lock and block
    647651                unlock( lock );
    648                 park();
     652                park( __cfaabi_dbg_ctx );
    649653                return true;
    650654        }
     
    667671
    668672        // make new owner
    669         unpark( thrd );
     673        unpark( thrd __cfaabi_dbg_ctx2 );
    670674
    671675        return thrd != 0p;
     
    678682        count += diff;
    679683        for(release) {
    680                 unpark( pop_head( waiting ) );
     684                unpark( pop_head( waiting ) __cfaabi_dbg_ctx2 );
    681685        }
    682686
     
    694698                        this.prev_thrd = kernelTLS.this_thread;
    695699                }
     700
     701                void __cfaabi_dbg_record_thrd($thread & this, bool park, const char prev_name[]) {
     702                        if(park) {
     703                                this.park_caller   = prev_name;
     704                                this.park_stale    = false;
     705                        }
     706                        else {
     707                                this.unpark_caller = prev_name;
     708                                this.unpark_stale  = false;
     709                        }
     710                }
    696711        }
    697712)
Note: See TracChangeset for help on using the changeset viewer.