Ignore:
File:
1 edited

Legend:

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

    rd25b2d6 r09d4b22  
    1717#include "bits/defs.hfa"
    1818#include "bits/locks.hfa"
    19 #include "kernel/fwd.hfa"
    2019
    2120#ifdef __cforall
     
    2726#define _INVOKE_H_
    2827
    29         struct __cfaehm_try_resume_node;
    30         struct __cfaehm_base_exception_t;
    31         struct exception_context_t {
    32                 struct __cfaehm_try_resume_node * top_resume;
    33                 struct __cfaehm_base_exception_t * current_exception;
    34         };
     28#ifdef __ARM_ARCH
     29        // function prototypes are only really used by these macros on ARM
     30        void disable_global_interrupts();
     31        void enable_global_interrupts();
     32
     33        #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \
     34                disable_global_interrupts(); \
     35                target = kernelTLS.member; \
     36                enable_global_interrupts(); \
     37                target; } )
     38        #define TL_SET( member, value ) disable_global_interrupts(); \
     39                kernelTLS.member = value; \
     40                enable_global_interrupts();
     41#else
     42        #define TL_GET( member ) kernelTLS.member
     43        #define TL_SET( member, value ) kernelTLS.member = value;
     44#endif
     45
     46        #ifdef __cforall
     47        extern "Cforall" {
     48                extern __attribute__((aligned(128))) thread_local struct KernelThreadData {
     49                        struct thread_desc    * volatile this_thread;
     50                        struct processor      * volatile this_processor;
     51
     52                        struct {
     53                                volatile unsigned short disable_count;
     54                                volatile bool enabled;
     55                                volatile bool in_progress;
     56                        } preemption_state;
     57
     58                        uint32_t rand_seed;
     59                } kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
     60        }
     61        #endif
    3562
    3663        struct __stack_context_t {
     
    5885                // base of stack
    5986                void * base;
    60 
    61                 // Information for exception handling.
    62                 struct exception_context_t exception_context;
    6387        };
    6488
     
    6892        };
    6993
    70         enum __Coroutine_State { Halted, Start, Primed, Blocked, Ready, Active, Cancelled, Halting };
    71 
    72         struct $coroutine {
    73                 // context that is switch during a __cfactx_switch
     94        enum coroutine_state { Halted, Start, Inactive, Active, Primed };
     95
     96        struct coroutine_desc {
     97                // context that is switch during a CtxSwitch
    7498                struct __stack_context_t context;
    7599
     
    81105
    82106                // current execution status for coroutine
    83                 enum __Coroutine_State state;
     107                enum coroutine_state state;
    84108
    85109                // first coroutine to resume this one
    86                 struct $coroutine * starter;
     110                struct coroutine_desc * starter;
    87111
    88112                // last coroutine to resume this one
    89                 struct $coroutine * last;
     113                struct coroutine_desc * last;
    90114
    91115                // If non-null stack must be unwound with this exception
     
    93117
    94118        };
    95         // Wrapper for gdb
    96         struct cfathread_coroutine_t { struct $coroutine debug; };
    97 
    98         static inline struct __stack_t * __get_stack( struct $coroutine * cor ) {
    99                 return (struct __stack_t*)(((uintptr_t)cor->stack.storage) & ((uintptr_t)-2));
    100         }
    101119
    102120        // struct which calls the monitor is accepting
     
    109127        };
    110128
    111         struct $monitor {
     129        struct monitor_desc {
    112130                // spinlock to protect internal data
    113131                struct __spinlock_t lock;
    114132
    115133                // current owner of the monitor
    116                 struct $thread * owner;
     134                struct thread_desc * owner;
    117135
    118136                // queue of threads that are blocked waiting for the monitor
    119                 __queue_t(struct $thread) entry_queue;
     137                __queue_t(struct thread_desc) entry_queue;
    120138
    121139                // stack of conditions to run next once we exit the monitor
     
    131149                struct __condition_node_t * dtor_node;
    132150        };
    133         // Wrapper for gdb
    134         struct cfathread_monitor_t { struct $monitor debug; };
    135151
    136152        struct __monitor_group_t {
    137153                // currently held monitors
    138                 __cfa_anonymous_object( __small_array_t($monitor*) );
     154                __cfa_anonymous_object( __small_array_t(monitor_desc*) );
    139155
    140156                // last function that acquired monitors
     
    142158        };
    143159
    144         // Link lists fields
    145         // instrusive link field for threads
    146         struct __thread_desc_link {
    147                 struct $thread * next;
    148                 struct $thread * prev;
    149                 volatile unsigned long long ts;
    150                 int preferred;
    151         };
    152 
    153         struct $thread {
     160        struct thread_desc {
    154161                // Core threading fields
    155                 // context that is switch during a __cfactx_switch
     162                // context that is switch during a CtxSwitch
    156163                struct __stack_context_t context;
    157164
    158165                // current execution status for coroutine
    159                 // Possible values are:
    160                 //    - TICKET_BLOCKED (-1) thread is blocked
    161                 //    - TICKET_RUNNING ( 0) thread is running
    162                 //    - TICKET_UNBLOCK ( 1) thread should ignore next block
    163                 volatile int ticket;
    164                 enum __Coroutine_State state:8;
    165                 enum __Preemption_Reason preempted:8;
     166                enum coroutine_state state;
    166167
    167168                //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it
     169
     170                // coroutine body used to store context
     171                struct coroutine_desc  self_cor;
     172
     173                // current active context
     174                struct coroutine_desc * curr_cor;
     175
     176                // monitor body used for mutual exclusion
     177                struct monitor_desc    self_mon;
     178
     179                // pointer to monitor with sufficient lifetime for current monitors
     180                struct monitor_desc *  self_mon_p;
    168181
    169182                // pointer to the cluster on which the thread is running
    170183                struct cluster * curr_cluster;
    171184
     185                // monitors currently held by this thread
     186                struct __monitor_group_t monitors;
     187
    172188                // Link lists fields
    173189                // instrusive link field for threads
    174                 struct __thread_desc_link link;
    175 
    176                 // coroutine body used to store context
    177                 struct $coroutine  self_cor;
    178 
    179                 // current active context
    180                 struct $coroutine * curr_cor;
    181 
    182                 // monitor body used for mutual exclusion
    183                 struct $monitor    self_mon;
    184 
    185                 // pointer to monitor with sufficient lifetime for current monitors
    186                 struct $monitor *  self_mon_p;
    187 
    188                 // monitors currently held by this thread
    189                 struct __monitor_group_t monitors;
    190 
    191                 // used to put threads on user data structures
     190                struct thread_desc * next;
     191
    192192                struct {
    193                         struct $thread * next;
    194                         struct $thread * back;
    195                 } seqable;
    196 
    197                 struct {
    198                         struct $thread * next;
    199                         struct $thread * prev;
     193                        struct thread_desc * next;
     194                        struct thread_desc * prev;
    200195                } node;
    201 
    202                 #if defined( __CFA_WITH_VERIFY__ )
    203                         void * canary;
    204                 #endif
    205         };
    206         // Wrapper for gdb
    207         struct cfathread_thread_t { struct $thread debug; };
    208 
    209         #ifdef __CFA_DEBUG__
    210                 void __cfaabi_dbg_record_thrd($thread & this, bool park, const char prev_name[]);
    211         #else
    212                 #define __cfaabi_dbg_record_thrd(x, y, z)
    213         #endif
     196        };
    214197
    215198        #ifdef __cforall
    216199        extern "Cforall" {
    217 
    218                 static inline $thread *& get_next( $thread & this ) __attribute__((const)) {
    219                         return this.link.next;
    220                 }
    221 
    222                 static inline [$thread *&, $thread *& ] __get( $thread & this ) __attribute__((const)) {
     200                static inline thread_desc *& get_next( thread_desc & this ) {
     201                        return this.next;
     202                }
     203
     204                static inline [thread_desc *&, thread_desc *& ] __get( thread_desc & this ) {
    223205                        return this.node.[next, prev];
    224                 }
    225 
    226                 static inline $thread *& Back( $thread * this ) __attribute__((const)) {
    227                         return this->seqable.back;
    228                 }
    229 
    230                 static inline $thread *& Next( $thread * this ) __attribute__((const)) {
    231                         return this->seqable.next;
    232                 }
    233 
    234                 static inline bool listed( $thread * this ) {
    235                         return this->seqable.next != 0p;
    236206                }
    237207
     
    242212                }
    243213
    244                 static inline void ?{}(__monitor_group_t & this, struct $monitor ** data, __lock_size_t size, fptr_t func) {
     214                static inline void ?{}(__monitor_group_t & this, struct monitor_desc ** data, __lock_size_t size, fptr_t func) {
    245215                        (this.data){data};
    246216                        (this.size){size};
     
    248218                }
    249219
    250                 static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) __attribute__((const)) {
     220                static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
    251221                        if( (lhs.data != 0) != (rhs.data != 0) ) return false;
    252222                        if( lhs.size != rhs.size ) return false;
     
    282252
    283253        // assembler routines that performs the context switch
    284         extern void __cfactx_invoke_stub( void );
    285         extern void __cfactx_switch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("__cfactx_switch");
     254        extern void CtxInvokeStub( void );
     255        extern void CtxSwitch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("CtxSwitch");
    286256        // void CtxStore ( void * this ) asm ("CtxStore");
    287257        // void CtxRet   ( void * dst  ) asm ("CtxRet");
Note: See TracChangeset for help on using the changeset viewer.