Ignore:
File:
1 edited

Legend:

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

    rac2b598 r2026bb6  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec  4 09:17:49 2019
    13 // Update Count     : 9
     12// Last Modified On : Fri Mar 30 17:19:52 2018
     13// Update Count     : 8
    1414//
    1515
     
    2323#include "invoke.h"
    2424
     25extern "C" {
     26        #include <fenv.h>
     27        #include <stddef.h>
     28}
     29
     30//extern volatile thread_local processor * this_processor;
     31
    2532//-----------------------------------------------------------------------------
    2633// Thread ctors and dtors
    27 void ?{}($thread & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {
    28         context{ 0p, 0p };
     34void ?{}(thread_desc & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {
     35        context{ NULL, NULL };
    2936        self_cor{ name, storage, storageSize };
    3037        state = Start;
    31         preempted = __NO_PREEMPTION;
    3238        curr_cor = &self_cor;
    3339        self_mon.owner = &this;
     
    3541        self_mon_p = &self_mon;
    3642        curr_cluster = &cl;
    37         next = 0p;
     43        next = NULL;
    3844
    39         node.next = 0p;
    40         node.prev = 0p;
     45        node.next = NULL;
     46        node.prev = NULL;
    4147        doregister(curr_cluster, this);
    4248
     
    4450}
    4551
    46 void ^?{}($thread& this) with( this ) {
     52void ^?{}(thread_desc& this) with( this ) {
    4753        unregister(curr_cluster, this);
    4854        ^self_cor{};
    4955}
    5056
    51 //-----------------------------------------------------------------------------
    52 // Starting and stopping threads
    53 forall( dtype T | is_thread(T) )
    54 void __thrd_start( T & this, void (*main_p)(T &) ) {
    55         $thread * this_thrd = get_thread(this);
    56 
    57         disable_interrupts();
    58         __cfactx_start(main_p, get_coroutine(this), this, __cfactx_invoke_thread);
    59 
    60         this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
    61         verify( this_thrd->context.SP );
    62 
    63         __schedule_thread(this_thrd);
    64         enable_interrupts( __cfaabi_dbg_ctx );
    65 }
    66 
    67 //-----------------------------------------------------------------------------
    68 // Support for threads that don't ues the thread keyword
    6957forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } )
    7058void ?{}( scoped(T)& this ) with( this ) {
    7159        handle{};
    72         __thrd_start(handle, main);
     60        __thrd_start(handle);
    7361}
    7462
     
    7664void ?{}( scoped(T)& this, P params ) with( this ) {
    7765        handle{ params };
    78         __thrd_start(handle, main);
     66        __thrd_start(handle);
    7967}
    8068
     
    8472}
    8573
     74//-----------------------------------------------------------------------------
     75// Starting and stopping threads
     76forall( dtype T | is_thread(T) )
     77void __thrd_start( T& this ) {
     78        thread_desc * this_thrd = get_thread(this);
     79        thread_desc * curr_thrd = TL_GET( this_thread );
     80
     81        disable_interrupts();
     82        CtxStart(&this, CtxInvokeThread);
     83        this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
     84        verify( this_thrd->context.SP );
     85        CtxSwitch( &curr_thrd->context, &this_thrd->context );
     86
     87        ScheduleThread(this_thrd);
     88        enable_interrupts( __cfaabi_dbg_ctx );
     89}
     90
     91extern "C" {
     92        // KERNEL ONLY
     93        void __finish_creation(thread_desc * this) {
     94                // set new coroutine that the processor is executing
     95                // and context switch to it
     96                verify( kernelTLS.this_thread != this );
     97                verify( kernelTLS.this_thread->context.SP );
     98                CtxSwitch( &this->context, &kernelTLS.this_thread->context );
     99        }
     100}
     101
     102void yield( void ) {
     103        // Safety note : This could cause some false positives due to preemption
     104      verify( TL_GET( preemption_state.enabled ) );
     105        BlockInternal( TL_GET( this_thread ) );
     106        // Safety note : This could cause some false positives due to preemption
     107      verify( TL_GET( preemption_state.enabled ) );
     108}
     109
     110void yield( unsigned times ) {
     111        for( unsigned i = 0; i < times; i++ ) {
     112                yield();
     113        }
     114}
     115
    86116// Local Variables: //
    87117// mode: c //
Note: See TracChangeset for help on using the changeset viewer.