Changes in libcfa/src/concurrency/invoke.h [d25b2d6:09d4b22]
- File:
-
- 1 edited
-
libcfa/src/concurrency/invoke.h (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
rd25b2d6 r09d4b22 17 17 #include "bits/defs.hfa" 18 18 #include "bits/locks.hfa" 19 #include "kernel/fwd.hfa"20 19 21 20 #ifdef __cforall … … 27 26 #define _INVOKE_H_ 28 27 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 35 62 36 63 struct __stack_context_t { … … 58 85 // base of stack 59 86 void * base; 60 61 // Information for exception handling.62 struct exception_context_t exception_context;63 87 }; 64 88 … … 68 92 }; 69 93 70 enum __Coroutine_State { Halted, Start, Primed, Blocked, Ready, Active, Cancelled, Halting};71 72 struct $coroutine{73 // context that is switch during a __cfactx_switch94 enum coroutine_state { Halted, Start, Inactive, Active, Primed }; 95 96 struct coroutine_desc { 97 // context that is switch during a CtxSwitch 74 98 struct __stack_context_t context; 75 99 … … 81 105 82 106 // current execution status for coroutine 83 enum __Coroutine_State state;107 enum coroutine_state state; 84 108 85 109 // first coroutine to resume this one 86 struct $coroutine* starter;110 struct coroutine_desc * starter; 87 111 88 112 // last coroutine to resume this one 89 struct $coroutine* last;113 struct coroutine_desc * last; 90 114 91 115 // If non-null stack must be unwound with this exception … … 93 117 94 118 }; 95 // Wrapper for gdb96 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 }101 119 102 120 // struct which calls the monitor is accepting … … 109 127 }; 110 128 111 struct $monitor{129 struct monitor_desc { 112 130 // spinlock to protect internal data 113 131 struct __spinlock_t lock; 114 132 115 133 // current owner of the monitor 116 struct $thread* owner;134 struct thread_desc * owner; 117 135 118 136 // 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; 120 138 121 139 // stack of conditions to run next once we exit the monitor … … 131 149 struct __condition_node_t * dtor_node; 132 150 }; 133 // Wrapper for gdb134 struct cfathread_monitor_t { struct $monitor debug; };135 151 136 152 struct __monitor_group_t { 137 153 // currently held monitors 138 __cfa_anonymous_object( __small_array_t( $monitor*) );154 __cfa_anonymous_object( __small_array_t(monitor_desc*) ); 139 155 140 156 // last function that acquired monitors … … 142 158 }; 143 159 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 { 154 161 // Core threading fields 155 // context that is switch during a __cfactx_switch162 // context that is switch during a CtxSwitch 156 163 struct __stack_context_t context; 157 164 158 165 // 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; 166 167 167 168 //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; 168 181 169 182 // pointer to the cluster on which the thread is running 170 183 struct cluster * curr_cluster; 171 184 185 // monitors currently held by this thread 186 struct __monitor_group_t monitors; 187 172 188 // Link lists fields 173 189 // 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 192 192 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; 200 195 } 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 }; 214 197 215 198 #ifdef __cforall 216 199 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 ) { 223 205 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;236 206 } 237 207 … … 242 212 } 243 213 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) { 245 215 (this.data){data}; 246 216 (this.size){size}; … … 248 218 } 249 219 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 ) { 251 221 if( (lhs.data != 0) != (rhs.data != 0) ) return false; 252 222 if( lhs.size != rhs.size ) return false; … … 282 252 283 253 // 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"); 286 256 // void CtxStore ( void * this ) asm ("CtxStore"); 287 257 // void CtxRet ( void * dst ) asm ("CtxRet");
Note:
See TracChangeset
for help on using the changeset viewer.