Ignore:
File:
1 edited

Legend:

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

    r445f984 r1f45c7d  
    2222#include <errno.h>
    2323#include <stdio.h>
    24 #include <string.h>
    2524#include <signal.h>
    2625#include <unistd.h>
     
    3231#include "kernel_private.hfa"
    3332#include "preemption.hfa"
    34 #include "strstream.hfa"
    35 #include "device/cpu.hfa"
    3633
    3734//Private includes
     
    113110#endif
    114111
    115 extern thread$ * mainThread;
     112extern $thread * mainThread;
    116113extern processor * mainProcessor;
    117114
    118115//-----------------------------------------------------------------------------
    119116// Kernel Scheduling logic
    120 static thread$ * __next_thread(cluster * this);
    121 static thread$ * __next_thread_slow(cluster * this);
    122 static inline bool __must_unpark( thread$ * thrd ) __attribute((nonnull(1)));
    123 static void __run_thread(processor * this, thread$ * dst);
     117static $thread * __next_thread(cluster * this);
     118static $thread * __next_thread_slow(cluster * this);
     119static inline bool __must_unpark( $thread * thrd ) __attribute((nonnull(1)));
     120static void __run_thread(processor * this, $thread * dst);
    124121static void __wake_one(cluster * cltr);
    125122
     
    184181                __cfadbg_print_safe(runtime_core, "Kernel : core %p started\n", this);
    185182
    186                 thread$ * readyThread = 0p;
     183                $thread * readyThread = 0p;
    187184                MAIN_LOOP:
    188185                for() {
     
    234231                                __cfadbg_print_safe(runtime_core, "Kernel : core %p waiting on eventfd %d\n", this, this->idle);
    235232
    236                                 {
    237                                         eventfd_t val;
    238                                         ssize_t ret = read( this->idle, &val, sizeof(val) );
    239                                         if(ret < 0) {
    240                                                 switch((int)errno) {
    241                                                 case EAGAIN:
    242                                                 #if EAGAIN != EWOULDBLOCK
    243                                                         case EWOULDBLOCK:
    244                                                 #endif
    245                                                 case EINTR:
    246                                                         // No need to do anything special here, just assume it's a legitimate wake-up
    247                                                         break;
    248                                                 default:
    249                                                         abort( "KERNEL : internal error, read failure on idle eventfd, error(%d) %s.", (int)errno, strerror( (int)errno ) );
    250                                                 }
    251                                         }
    252                                 }
     233                                __disable_interrupts_hard();
     234                                eventfd_t val;
     235                                eventfd_read( this->idle, &val );
     236                                __enable_interrupts_hard();
    253237
    254238                                #if !defined(__CFA_NO_STATISTICS__)
     
    404388// runThread runs a thread by context switching
    405389// from the processor coroutine to the target thread
    406 static void __run_thread(processor * this, thread$ * thrd_dst) {
     390static void __run_thread(processor * this, $thread * thrd_dst) {
    407391        /* paranoid */ verify( ! __preemption_enabled() );
    408392        /* paranoid */ verifyf( thrd_dst->state == Ready || thrd_dst->preempted != __NO_PREEMPTION, "state : %d, preempted %d\n", thrd_dst->state, thrd_dst->preempted);
     
    422406        __cfadbg_print_safe(runtime_core, "Kernel : core %p running thread %p (%s)\n", this, thrd_dst, thrd_dst->self_cor.name);
    423407
    424         coroutine$ * proc_cor = get_coroutine(this->runner);
     408        $coroutine * proc_cor = get_coroutine(this->runner);
    425409
    426410        // set state of processor coroutine to inactive
     
    441425                /* paranoid */ verify( thrd_dst->context.SP );
    442426                /* paranoid */ verify( thrd_dst->state != Halted );
    443                 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination thread$ %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor
    444                 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination thread$ %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor
     427                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor
     428                /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor
    445429                /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary );
    446430
     
    454438
    455439                /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary );
    456                 /* 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 );
    457                 /* 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 );
     440                /* 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 );
     441                /* 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 );
    458442                /* paranoid */ verify( thrd_dst->context.SP );
    459443                /* paranoid */ verify( thrd_dst->curr_cluster == this->cltr );
     
    521505void returnToKernel() {
    522506        /* paranoid */ verify( ! __preemption_enabled() );
    523         coroutine$ * proc_cor = get_coroutine(kernelTLS().this_processor->runner);
    524         thread$ * thrd_src = kernelTLS().this_thread;
     507        $coroutine * proc_cor = get_coroutine(kernelTLS().this_processor->runner);
     508        $thread * thrd_src = kernelTLS().this_thread;
    525509
    526510        __STATS( thrd_src->last_proc = kernelTLS().this_processor; )
     
    550534
    551535        /* paranoid */ verify( ! __preemption_enabled() );
    552         /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) < ((uintptr_t)__get_stack(thrd_src->curr_cor)->base ) || thrd_src->corctx_flag, "ERROR : Returning thread$ %p has been corrupted.\n StackPointer too small.\n", thrd_src );
    553         /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) > ((uintptr_t)__get_stack(thrd_src->curr_cor)->limit) || thrd_src->corctx_flag, "ERROR : Returning thread$ %p has been corrupted.\n StackPointer too large.\n", thrd_src );
     536        /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) < ((uintptr_t)__get_stack(thrd_src->curr_cor)->base ) || thrd_src->corctx_flag, "ERROR : Returning $thread %p has been corrupted.\n StackPointer too small.\n", thrd_src );
     537        /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) > ((uintptr_t)__get_stack(thrd_src->curr_cor)->limit) || thrd_src->corctx_flag, "ERROR : Returning $thread %p has been corrupted.\n StackPointer too large.\n", thrd_src );
    554538}
    555539
     
    557541// Scheduler routines
    558542// KERNEL ONLY
    559 static void __schedule_thread( thread$ * thrd ) {
     543static void __schedule_thread( $thread * thrd ) {
    560544        /* paranoid */ verify( ! __preemption_enabled() );
    561545        /* paranoid */ verify( ready_schedule_islocked());
     
    605589}
    606590
    607 void schedule_thread$( thread$ * thrd ) {
     591void schedule_thread$( $thread * thrd ) {
    608592        ready_schedule_lock();
    609593                __schedule_thread( thrd );
     
    612596
    613597// KERNEL ONLY
    614 static inline thread$ * __next_thread(cluster * this) with( *this ) {
     598static inline $thread * __next_thread(cluster * this) with( *this ) {
    615599        /* paranoid */ verify( ! __preemption_enabled() );
    616600
    617601        ready_schedule_lock();
    618                 thread$ * thrd = pop_fast( this );
     602                $thread * thrd = pop_fast( this );
    619603        ready_schedule_unlock();
    620604
     
    624608
    625609// KERNEL ONLY
    626 static inline thread$ * __next_thread_slow(cluster * this) with( *this ) {
     610static inline $thread * __next_thread_slow(cluster * this) with( *this ) {
    627611        /* paranoid */ verify( ! __preemption_enabled() );
    628612
    629613        ready_schedule_lock();
    630                 thread$ * thrd;
     614                $thread * thrd;
    631615                for(25) {
    632616                        thrd = pop_slow( this );
     
    642626}
    643627
    644 static inline bool __must_unpark( thread$ * thrd ) {
     628static inline bool __must_unpark( $thread * thrd ) {
    645629        int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST);
    646630        switch(old_ticket) {
     
    658642}
    659643
    660 void __kernel_unpark( thread$ * thrd ) {
     644void __kernel_unpark( $thread * thrd ) {
    661645        /* paranoid */ verify( ! __preemption_enabled() );
    662646        /* paranoid */ verify( ready_schedule_islocked());
     
    673657}
    674658
    675 void unpark( thread$ * thrd ) {
     659void unpark( $thread * thrd ) {
    676660        if( !thrd ) return;
    677661
     
    697681        // Should never return
    698682        void __cfactx_thrd_leave() {
    699                 thread$ * thrd = active_thread();
    700                 monitor$ * this = &thrd->self_mon;
     683                $thread * thrd = active_thread();
     684                $monitor * this = &thrd->self_mon;
    701685
    702686                // Lock the monitor now
     
    710694                /* paranoid */ verify( kernelTLS().this_thread == thrd );
    711695                /* paranoid */ verify( thrd->context.SP );
    712                 /* 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 );
    713                 /* 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 );
     696                /* 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 );
     697                /* 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 );
    714698
    715699                thrd->state = Halting;
     
    729713bool force_yield( __Preemption_Reason reason ) {
    730714        __disable_interrupts_checked();
    731                 thread$ * thrd = kernelTLS().this_thread;
     715                $thread * thrd = kernelTLS().this_thread;
    732716                /* paranoid */ verify(thrd->state == Active);
    733717
     
    841825//=============================================================================================
    842826void __kernel_abort_msg( char * abort_text, int abort_text_size ) {
    843         thread$ * thrd = __cfaabi_tls.this_thread;
     827        $thread * thrd = __cfaabi_tls.this_thread;
    844828
    845829        if(thrd) {
Note: See TracChangeset for help on using the changeset viewer.