Changes in libcfa/src/concurrency/invoke.h [b798713:ae7be7a]
- File:
-
- 1 edited
-
libcfa/src/concurrency/invoke.h (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
rb798713 rae7be7a 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jun 22 18:19:13 201913 // Update Count : 4 012 // Last Modified On : Thu Dec 5 16:26:03 2019 13 // Update Count : 44 14 14 // 15 15 … … 47 47 extern "Cforall" { 48 48 extern __attribute__((aligned(128))) thread_local struct KernelThreadData { 49 struct thread_desc* volatile this_thread;49 struct $thread * volatile this_thread; 50 50 struct processor * volatile this_processor; 51 51 … … 92 92 }; 93 93 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 98 99 struct __stack_context_t context; 99 100 … … 108 109 109 110 // first coroutine to resume this one 110 struct coroutine_desc* starter;111 struct $coroutine * starter; 111 112 112 113 // last coroutine to resume this one 113 struct coroutine_desc* last;114 struct $coroutine * last; 114 115 115 116 // If non-null stack must be unwound with this exception … … 117 118 118 119 }; 120 121 static inline struct __stack_t * __get_stack( struct $coroutine * cor ) { return (struct __stack_t*)(((uintptr_t)cor->stack.storage) & ((uintptr_t)-2)); } 119 122 120 123 // struct which calls the monitor is accepting … … 127 130 }; 128 131 129 struct monitor_desc{132 struct $monitor { 130 133 // spinlock to protect internal data 131 134 struct __spinlock_t lock; 132 135 133 136 // current owner of the monitor 134 struct thread_desc* owner;137 struct $thread * owner; 135 138 136 139 // 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; 138 141 139 142 // stack of conditions to run next once we exit the monitor … … 152 155 struct __monitor_group_t { 153 156 // currently held monitors 154 __cfa_anonymous_object( __small_array_t( monitor_desc*) );157 __cfa_anonymous_object( __small_array_t($monitor*) ); 155 158 156 159 // last function that acquired monitors … … 158 161 }; 159 162 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 { 169 164 // Core threading fields 170 // context that is switch during a CtxSwitch165 // context that is switch during a __cfactx_switch 171 166 struct __stack_context_t context; 172 167 173 168 // current execution status for coroutine 174 enum coroutine_state state; 169 volatile int state; 170 enum __Preemption_Reason preempted; 175 171 176 172 //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it 177 173 178 174 // coroutine body used to store context 179 struct coroutine_descself_cor;175 struct $coroutine self_cor; 180 176 181 177 // current active context 182 struct coroutine_desc* curr_cor;178 struct $coroutine * curr_cor; 183 179 184 180 // monitor body used for mutual exclusion 185 struct monitor_descself_mon;181 struct $monitor self_mon; 186 182 187 183 // pointer to monitor with sufficient lifetime for current monitors 188 struct monitor_desc* self_mon_p;184 struct $monitor * self_mon_p; 189 185 190 186 // pointer to the cluster on which the thread is running … … 196 192 // Link lists fields 197 193 // instrusive link field for threads 198 struct __thread_desc_link link;194 struct $thread * next; 199 195 200 196 struct { 201 struct thread_desc* next;202 struct thread_desc* prev;197 struct $thread * next; 198 struct $thread * prev; 203 199 } 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 205 217 206 218 #ifdef __cforall 207 219 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)) { 213 225 return this.node.[next, prev]; 214 226 } 215 227 216 228 static inline void ?{}(__monitor_group_t & this) { 217 (this.data){ NULL};229 (this.data){0p}; 218 230 (this.size){0}; 219 231 (this.func){NULL}; 220 232 } 221 233 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) { 223 235 (this.data){data}; 224 236 (this.size){size}; … … 226 238 } 227 239 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)) { 229 241 if( (lhs.data != 0) != (rhs.data != 0) ) return false; 230 242 if( lhs.size != rhs.size ) return false; … … 260 272 261 273 // 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"); 264 276 // void CtxStore ( void * this ) asm ("CtxStore"); 265 277 // void CtxRet ( void * dst ) asm ("CtxRet");
Note:
See TracChangeset
for help on using the changeset viewer.