Ignore:
File:
1 edited

Legend:

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

    r3ea8ad1 rac12f1f  
    251251                /* paranoid */ verify( ! __preemption_enabled() );
    252252                /* paranoid */ verify( kernelTLS().this_thread == thrd_dst );
    253                 /* paranoid */ verify( thrd_dst->curr_cluster == this->cltr );
    254253                /* paranoid */ verify( thrd_dst->context.SP );
    255254                /* paranoid */ verify( thrd_dst->state != Halted );
     
    268267                /* 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 );
    269268                /* paranoid */ verify( thrd_dst->context.SP );
    270                 /* paranoid */ verify( thrd_dst->curr_cluster == this->cltr );
    271269                /* paranoid */ verify( kernelTLS().this_thread == thrd_dst );
    272270                /* paranoid */ verify( ! __preemption_enabled() );
     
    288286                }
    289287
    290                 if(unlikely(thrd_dst->state == Halting)) {
     288                if(unlikely(thrd_dst->state == Halted)) {
    291289                        // The thread has halted, it should never be scheduled/run again
    292290                        // finish the thread
     
    362360void __schedule_thread( $thread * thrd ) {
    363361        /* paranoid */ verify( ! __preemption_enabled() );
    364         /* paranoid */ verify( kernelTLS().this_proc_id );
    365362        /* paranoid */ verify( thrd );
    366363        /* paranoid */ verify( thrd->state != Halted );
    367         /* paranoid */ verify( thrd->curr_cluster );
     364        /* paranoid */ verify( kernelTLS().this_proc_id );
    368365        /* paranoid */ #if defined( __CFA_WITH_VERIFY__ )
    369366        /* paranoid */  if( thrd->state == Blocked || thrd->state == Start ) assertf( thrd->preempted == __NO_PREEMPTION,
     
    476473                disable_interrupts();
    477474
     475                thrd->state = Halted;
     476                if( TICKET_RUNNING != thrd->ticket ) { abort( "Thread terminated with pending unpark" ); }
     477                if( thrd != this->owner || this->recursion != 1) { abort( "Thread internal monitor has unbalanced recursion" ); }
     478
     479                // Leave the thread
    478480                /* paranoid */ verify( ! __preemption_enabled() );
    479                 /* paranoid */ verify( thrd->state == Active );
    480                 /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd->canary );
    481                 /* paranoid */ verify( kernelTLS().this_thread == thrd );
    482                 /* paranoid */ verify( thrd->context.SP );
    483                 /* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) > ((uintptr_t)__get_stack(thrd->curr_cor)->limit), "ERROR : $thread %p has been corrupted.\n StackPointer too large.\n", thrd );
    484                 /* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) < ((uintptr_t)__get_stack(thrd->curr_cor)->base ), "ERROR : $thread %p has been corrupted.\n StackPointer too small.\n", thrd );
    485 
    486                 thrd->state = Halting;
    487                 if( TICKET_RUNNING != thrd->ticket ) { abort( "Thread terminated with pending unpark" ); }
    488                 if( thrd != this->owner ) { abort( "Thread internal monitor has incorrect owner" ); }
    489                 if( this->recursion != 1) { abort( "Thread internal monitor has unbalanced recursion" ); }
    490 
    491                 // Leave the thread
    492481                returnToKernel();
     482                abort();
    493483
    494484                // Control flow should never reach here!
    495                 abort();
    496485        }
    497486}
Note: See TracChangeset for help on using the changeset viewer.