Changeset ab5baab


Ignore:
Timestamp:
Jun 2, 2021, 5:22:57 PM (12 months ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
arm-eh, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr
Children:
96bfdde7, e014c6d
Parents:
e9ea53d
Message:

Attempt to fix the stack checker for when coroutines are interrupted at the wrong moment

Location:
libcfa/src/concurrency
Files:
6 edited

Legend:

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

    re9ea53d rab5baab  
    267267                struct $coroutine * cor = active_coroutine();
    268268
     269                // get the active thread once
     270                $thread * athrd = active_thread();
     271
     272                /* paranoid */ verify( athrd->corctx_flag );
     273                athrd->corctx_flag = false;
     274
    269275                if(cor->state == Primed) {
    270276                        __cfactx_suspend();
  • libcfa/src/concurrency/coroutine.hfa

    re9ea53d rab5baab  
    8686        src->state = src->state == Halted ? Halted : Blocked;
    8787
     88        // get the active thread once
     89        $thread * athrd = active_thread();
     90
     91        // Mark the coroutine
     92        /* paranoid */ verify( !athrd->corctx_flag );
     93        athrd->corctx_flag = true;
     94
    8895        // set new coroutine that task is executing
    89         active_thread()->curr_cor = dst;
     96        athrd->curr_cor = dst;
    9097
    9198        // context switch to specified coroutine
    92         verify( dst->context.SP );
     99        /* paranoid */ verify( dst->context.SP );
    93100        __cfactx_switch( &src->context, &dst->context );
    94101        // when __cfactx_switch returns we are back in the src coroutine
     102
     103        /* paranoid */ verify( athrd->corctx_flag );
     104        athrd->corctx_flag = false;
    95105
    96106        // set state of new coroutine to active
  • libcfa/src/concurrency/invoke.h

    re9ea53d rab5baab  
    167167                enum __Preemption_Reason preempted:8;
    168168
     169                bool corctx_flag;
     170
    169171                //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it
    170172
  • libcfa/src/concurrency/kernel.cfa

    re9ea53d rab5baab  
    424424
    425425                /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary );
    426                 /* 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 );
    427                 /* 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 );
     426                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst );
     427                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst );
    428428                /* paranoid */ verify( thrd_dst->context.SP );
    429429                /* paranoid */ verify( thrd_dst->curr_cluster == this->cltr );
  • libcfa/src/concurrency/kernel/startup.cfa

    re9ea53d rab5baab  
    397397        // make sure the current state is still correct
    398398        /* paranoid */ verify(src->state == Ready);
     399        src->corctx_flag = true;
    399400
    400401        // context switch to specified coroutine
  • libcfa/src/concurrency/thread.cfa

    re9ea53d rab5baab  
    3232        state = Start;
    3333        preempted = __NO_PREEMPTION;
     34        corctx_flag = false;
    3435        curr_cor = &self_cor;
    3536        self_mon.owner = &this;
Note: See TracChangeset for help on using the changeset viewer.