Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/invoke.h

    rb798713 rae7be7a  
    1010// Created On       : Tue Jan 17 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jun 22 18:19:13 2019
    13 // Update Count     : 40
     12// Last Modified On : Thu Dec  5 16:26:03 2019
     13// Update Count     : 44
    1414//
    1515
     
    4747        extern "Cforall" {
    4848                extern __attribute__((aligned(128))) thread_local struct KernelThreadData {
    49                         struct thread_desc    * volatile this_thread;
     49                        struct $thread    * volatile this_thread;
    5050                        struct processor      * volatile this_processor;
    5151
     
    9292        };
    9393
    94         enum coroutine_state { Halted, Start, Inactive, Active, Primed };
    95 
    96         struct coroutine_desc {
    97                 // context that is switch during a CtxSwitch
     94        enum coroutine_state { Halted, Start, Primed, Blocked, Ready, Active, Rerun };
     95        enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION };
     96
     97        struct $coroutine {
     98                // context that is switch during a __cfactx_switch
    9899                struct __stack_context_t context;
    99100
     
    108109
    109110                // first coroutine to resume this one
    110                 struct coroutine_desc * starter;
     111                struct $coroutine * starter;
    111112
    112113                // last coroutine to resume this one
    113                 struct coroutine_desc * last;
     114                struct $coroutine * last;
    114115
    115116                // If non-null stack must be unwound with this exception
     
    117118
    118119        };
     120
     121        static inline struct __stack_t * __get_stack( struct $coroutine * cor ) { return (struct __stack_t*)(((uintptr_t)cor->stack.storage) & ((uintptr_t)-2)); }
    119122
    120123        // struct which calls the monitor is accepting
     
    127130        };
    128131
    129         struct monitor_desc {
     132        struct $monitor {
    130133                // spinlock to protect internal data
    131134                struct __spinlock_t lock;
    132135
    133136                // current owner of the monitor
    134                 struct thread_desc * owner;
     137                struct $thread * owner;
    135138
    136139                // queue of threads that are blocked waiting for the monitor
    137                 __queue_t(struct thread_desc) entry_queue;
     140                __queue_t(struct $thread) entry_queue;
    138141
    139142                // stack of conditions to run next once we exit the monitor
     
    152155        struct __monitor_group_t {
    153156                // currently held monitors
    154                 __cfa_anonymous_object( __small_array_t(monitor_desc*) );
     157                __cfa_anonymous_object( __small_array_t($monitor*) );
    155158
    156159                // last function that acquired monitors
     
    158161        };
    159162
    160         // Link lists fields
    161         // instrusive link field for threads
    162         struct __thread_desc_link {
    163                 struct thread_desc * next;
    164                 struct thread_desc * prev;
    165                 unsigned long long ts;
    166         };
    167 
    168         struct thread_desc {
     163        struct $thread {
    169164                // Core threading fields
    170                 // context that is switch during a CtxSwitch
     165                // context that is switch during a __cfactx_switch
    171166                struct __stack_context_t context;
    172167
    173168                // current execution status for coroutine
    174                 enum coroutine_state state;
     169                volatile int state;
     170                enum __Preemption_Reason preempted;
    175171
    176172                //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it
    177173
    178174                // coroutine body used to store context
    179                 struct coroutine_desc  self_cor;
     175                struct $coroutine  self_cor;
    180176
    181177                // current active context
    182                 struct coroutine_desc * curr_cor;
     178                struct $coroutine * curr_cor;
    183179
    184180                // monitor body used for mutual exclusion
    185                 struct monitor_desc    self_mon;
     181                struct $monitor    self_mon;
    186182
    187183                // pointer to monitor with sufficient lifetime for current monitors
    188                 struct monitor_desc *  self_mon_p;
     184                struct $monitor *  self_mon_p;
    189185
    190186                // pointer to the cluster on which the thread is running
     
    196192                // Link lists fields
    197193                // instrusive link field for threads
    198                 struct __thread_desc_link link;
     194                struct $thread * next;
    199195
    200196                struct {
    201                         struct thread_desc * next;
    202                         struct thread_desc * prev;
     197                        struct $thread * next;
     198                        struct $thread * prev;
    203199                } node;
    204         };
     200
     201                #ifdef __CFA_DEBUG__
     202                        // previous function to park/unpark the thread
     203                        const char * park_caller;
     204                        enum coroutine_state park_result;
     205                        bool park_stale;
     206                        const char * unpark_caller;
     207                        enum coroutine_state unpark_result;
     208                        bool unpark_stale;
     209                #endif
     210        };
     211
     212        #ifdef __CFA_DEBUG__
     213                void __cfaabi_dbg_record_thrd($thread & this, bool park, const char prev_name[]);
     214        #else
     215                #define __cfaabi_dbg_record_thrd(x, y, z)
     216        #endif
    205217
    206218        #ifdef __cforall
    207219        extern "Cforall" {
    208                 static inline thread_desc *& get_next( thread_desc & this ) {
    209                         return this.link.next;
    210                 }
    211 
    212                 static inline [thread_desc *&, thread_desc *& ] __get( thread_desc & this ) {
     220                static inline $thread *& get_next( $thread & this ) __attribute__((const)) {
     221                        return this.next;
     222                }
     223
     224                static inline [$thread *&, $thread *& ] __get( $thread & this ) __attribute__((const)) {
    213225                        return this.node.[next, prev];
    214226                }
    215227
    216228                static inline void ?{}(__monitor_group_t & this) {
    217                         (this.data){NULL};
     229                        (this.data){0p};
    218230                        (this.size){0};
    219231                        (this.func){NULL};
    220232                }
    221233
    222                 static inline void ?{}(__monitor_group_t & this, struct monitor_desc ** data, __lock_size_t size, fptr_t func) {
     234                static inline void ?{}(__monitor_group_t & this, struct $monitor ** data, __lock_size_t size, fptr_t func) {
    223235                        (this.data){data};
    224236                        (this.size){size};
     
    226238                }
    227239
    228                 static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
     240                static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) __attribute__((const)) {
    229241                        if( (lhs.data != 0) != (rhs.data != 0) ) return false;
    230242                        if( lhs.size != rhs.size ) return false;
     
    260272
    261273        // assembler routines that performs the context switch
    262         extern void CtxInvokeStub( void );
    263         extern void CtxSwitch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("CtxSwitch");
     274        extern void __cfactx_invoke_stub( void );
     275        extern void __cfactx_switch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("__cfactx_switch");
    264276        // void CtxStore ( void * this ) asm ("CtxStore");
    265277        // void CtxRet   ( void * dst  ) asm ("CtxRet");
Note: See TracChangeset for help on using the changeset viewer.