Ignore:
File:
1 edited

Legend:

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

    rb158d8f r65deb18  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec  8 16:23:33 2017
    13 // Update Count     : 3
     12// Last Modified On : Fri Jul 21 22:33:18 2017
     13// Update Count     : 2
    1414//
    1515
    1616//C Includes
    1717#include <stddef.h>
    18 #define ftype `ftype`
    1918extern "C" {
    2019#include <stdio.h>
     
    2423#include <unistd.h>
    2524}
    26 #undef ftype
    2725
    2826//CFA Includes
     
    8785}
    8886
    89 void ?{}( coStack_t & this, current_stack_info_t * info) {
    90         this.size = info->size;
    91         this.storage = info->storage;
    92         this.limit = info->limit;
    93         this.base = info->base;
    94         this.context = info->context;
    95         this.top = info->top;
    96         this.userStack = true;
    97 }
    98 
    99 void ?{}( coroutine_desc & this, current_stack_info_t * info) {
    100         (this.stack){ info };
    101         this.name = "Main Thread";
    102         this.errno_ = 0;
    103         this.state = Start;
    104         this.starter = NULL;
    105 }
    106 
    107 void ?{}( thread_desc & this, current_stack_info_t * info) {
    108         (this.self_cor){ info };
     87void ?{}( coStack_t & this, current_stack_info_t * info) with( this ) {
     88        size      = info->size;
     89        storage  = info->storage;
     90        limit    = info->limit;
     91        base      = info->base;
     92        context  = info->context;
     93        top      = info->top;
     94        userStack = true;
     95}
     96
     97void ?{}( coroutine_desc & this, current_stack_info_t * info) with( this ) {
     98        stack{ info };
     99        name = "Main Thread";
     100        errno_ = 0;
     101        state = Start;
     102        starter = NULL;
     103}
     104
     105void ?{}( thread_desc & this, current_stack_info_t * info) with( this ) {
     106        self_cor{ info };
    109107}
    110108
     
    133131void ?{}(processor & this, cluster * cltr) {
    134132        this.cltr = cltr;
    135         (this.terminated){ 0 };
     133        this.terminated{ 0 };
    136134        this.do_terminate = false;
    137135        this.preemption_alarm = NULL;
     
    143141void ?{}(processor & this, cluster * cltr, processorCtx_t & runner) {
    144142        this.cltr = cltr;
    145         (this.terminated){ 0 };
     143        this.terminated{ 0 };
    146144        this.do_terminate = false;
    147145        this.preemption_alarm = NULL;
     
    154152}
    155153
    156 void ^?{}(processor & this) {
    157         if( ! this.do_terminate ) {
     154void ^?{}(processor & this) with( this ){
     155        if( ! do_terminate ) {
    158156                __cfaabi_dbg_print_safe("Kernel : core %p signaling termination\n", &this);
    159                 this.do_terminate = true;
    160                 P( this.terminated );
    161                 pthread_join( this.kernel_thread, NULL );
    162         }
    163 }
    164 
    165 void ?{}(cluster & this) {
    166         (this.ready_queue){};
    167         ( this.ready_queue_lock ){};
    168 
    169         this.preemption = default_preemption();
     157                do_terminate = true;
     158                P( terminated );
     159                pthread_join( kernel_thread, NULL );
     160        }
     161}
     162
     163void ?{}(cluster & this) with( this ) {
     164        ready_queue{};
     165        ready_queue_lock{};
     166
     167        preemption = default_preemption();
    170168}
    171169
     
    240238// Once a thread has finished running, some of
    241239// its final actions must be executed from the kernel
    242 void finishRunning(processor * this) {
    243         if( this->finish.action_code == Release ) {
    244                 unlock( *this->finish.lock );
    245         }
    246         else if( this->finish.action_code == Schedule ) {
    247                 ScheduleThread( this->finish.thrd );
    248         }
    249         else if( this->finish.action_code == Release_Schedule ) {
    250                 unlock( *this->finish.lock );
    251                 ScheduleThread( this->finish.thrd );
    252         }
    253         else if( this->finish.action_code == Release_Multi ) {
    254                 for(int i = 0; i < this->finish.lock_count; i++) {
    255                         unlock( *this->finish.locks[i] );
     240void finishRunning(processor * this) with( this->finish ) {
     241        if( action_code == Release ) {
     242                unlock( *lock );
     243        }
     244        else if( action_code == Schedule ) {
     245                ScheduleThread( thrd );
     246        }
     247        else if( action_code == Release_Schedule ) {
     248                unlock( *lock );
     249                ScheduleThread( thrd );
     250        }
     251        else if( action_code == Release_Multi ) {
     252                for(int i = 0; i < lock_count; i++) {
     253                        unlock( *locks[i] );
    256254                }
    257255        }
    258         else if( this->finish.action_code == Release_Multi_Schedule ) {
    259                 for(int i = 0; i < this->finish.lock_count; i++) {
    260                         unlock( *this->finish.locks[i] );
     256        else if( action_code == Release_Multi_Schedule ) {
     257                for(int i = 0; i < lock_count; i++) {
     258                        unlock( *locks[i] );
    261259                }
    262                 for(int i = 0; i < this->finish.thrd_count; i++) {
    263                         ScheduleThread( this->finish.thrds[i] );
     260                for(int i = 0; i < thrd_count; i++) {
     261                        ScheduleThread( thrds[i] );
    264262                }
    265263        }
    266264        else {
    267                 assert(this->finish.action_code == No_Action);
     265                assert(action_code == No_Action);
    268266        }
    269267}
     
    334332        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    335333
    336         lock(   this_processor->cltr->ready_queue_lock __cfaabi_dbg_ctx2 );
    337         append( this_processor->cltr->ready_queue, thrd );
    338         unlock( this_processor->cltr->ready_queue_lock );
    339 
    340         verify( disable_preempt_count > 0 );
    341 }
    342 
    343 thread_desc * nextThread(cluster * this) {
    344         verify( disable_preempt_count > 0 );
    345         lock( this->ready_queue_lock __cfaabi_dbg_ctx2 );
    346         thread_desc * head = pop_head( this->ready_queue );
    347         unlock( this->ready_queue_lock );
     334        with( *this_processor->cltr ) {
     335                lock  ( ready_queue_lock __cfaabi_dbg_ctx2 );
     336                append( ready_queue, thrd );
     337                unlock( ready_queue_lock );
     338        }
     339
     340        verify( disable_preempt_count > 0 );
     341}
     342
     343thread_desc * nextThread(cluster * this) with( *this ) {
     344        verify( disable_preempt_count > 0 );
     345        lock( ready_queue_lock __cfaabi_dbg_ctx2 );
     346        thread_desc * head = pop_head( ready_queue );
     347        unlock( ready_queue_lock );
    348348        verify( disable_preempt_count > 0 );
    349349        return head;
     
    361361        disable_interrupts();
    362362        this_processor->finish.action_code = Release;
    363         this_processor->finish.lock = lock;
     363        this_processor->finish.lock        = lock;
    364364
    365365        verify( disable_preempt_count > 0 );
     
    371371
    372372void BlockInternal( thread_desc * thrd ) {
    373         assert(thrd);
    374373        disable_interrupts();
    375         assert( thrd->self_cor.state != Halted );
    376374        this_processor->finish.action_code = Schedule;
    377         this_processor->finish.thrd = thrd;
     375        this_processor->finish.thrd        = thrd;
    378376
    379377        verify( disable_preempt_count > 0 );
     
    388386        disable_interrupts();
    389387        this_processor->finish.action_code = Release_Schedule;
    390         this_processor->finish.lock = lock;
    391         this_processor->finish.thrd = thrd;
     388        this_processor->finish.lock        = lock;
     389        this_processor->finish.thrd        = thrd;
    392390
    393391        verify( disable_preempt_count > 0 );
     
    401399        disable_interrupts();
    402400        this_processor->finish.action_code = Release_Multi;
    403         this_processor->finish.locks = locks;
    404         this_processor->finish.lock_count = count;
     401        this_processor->finish.locks       = locks;
     402        this_processor->finish.lock_count  = count;
    405403
    406404        verify( disable_preempt_count > 0 );
     
    414412        disable_interrupts();
    415413        this_processor->finish.action_code = Release_Multi_Schedule;
    416         this_processor->finish.locks = locks;
    417         this_processor->finish.lock_count = lock_count;
    418         this_processor->finish.thrds = thrds;
    419         this_processor->finish.thrd_count = thrd_count;
     414        this_processor->finish.locks       = locks;
     415        this_processor->finish.lock_count  = lock_count;
     416        this_processor->finish.thrds       = thrds;
     417        this_processor->finish.thrd_count  = thrd_count;
    420418
    421419        verify( disable_preempt_count > 0 );
     
    429427        verify( disable_preempt_count > 0 );
    430428        this_processor->finish.action_code = thrd ? Release_Schedule : Release;
    431         this_processor->finish.lock = lock;
    432         this_processor->finish.thrd = thrd;
     429        this_processor->finish.lock        = lock;
     430        this_processor->finish.thrd        = thrd;
    433431
    434432        suspend();
     
    581579void ^?{}(semaphore & this) {}
    582580
    583 void P(semaphore & this) {
    584         lock( this.lock __cfaabi_dbg_ctx2 );
    585         this.count -= 1;
    586         if ( this.count < 0 ) {
     581void P(semaphore & this) with( this ){
     582        lock( lock __cfaabi_dbg_ctx2 );
     583        count -= 1;
     584        if ( count < 0 ) {
    587585                // queue current task
    588                 append( this.waiting, (thread_desc *)this_thread );
     586                append( waiting, (thread_desc *)this_thread );
    589587
    590588                // atomically release spin lock and block
    591                 BlockInternal( &this.lock );
     589                BlockInternal( &lock );
    592590        }
    593591        else {
    594             unlock( this.lock );
    595         }
    596 }
    597 
    598 void V(semaphore & this) {
     592            unlock( lock );
     593        }
     594}
     595
     596void V(semaphore & this) with( this ) {
    599597        thread_desc * thrd = NULL;
    600         lock( this.lock __cfaabi_dbg_ctx2 );
    601         this.count += 1;
    602         if ( this.count <= 0 ) {
     598        lock( lock __cfaabi_dbg_ctx2 );
     599        count += 1;
     600        if ( count <= 0 ) {
    603601                // remove task at head of waiting list
    604                 thrd = pop_head( this.waiting );
    605         }
    606 
    607         unlock( this.lock );
     602                thrd = pop_head( waiting );
     603        }
     604
     605        unlock( lock );
    608606
    609607        // make new owner
Note: See TracChangeset for help on using the changeset viewer.