Changes in libcfa/src/concurrency/invoke.h [ac2b598:3623f9d]
- File:
-
- 1 edited
-
libcfa/src/concurrency/invoke.h (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
rac2b598 r3623f9d 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Dec 5 16:26:03 201913 // Update Count : 4 412 // Last Modified On : Sat Jun 22 18:19:13 2019 13 // Update Count : 40 14 14 // 15 15 … … 46 46 #ifdef __cforall 47 47 extern "Cforall" { 48 extern __attribute__((aligned(128)))thread_local struct KernelThreadData {49 struct $thread* volatile this_thread;48 extern thread_local struct KernelThreadData { 49 struct thread_desc * volatile this_thread; 50 50 struct processor * volatile this_processor; 51 51 … … 55 55 volatile bool in_progress; 56 56 } preemption_state; 57 58 uint32_t rand_seed;59 57 } kernelTLS __attribute__ ((tls_model ( "initial-exec" ))); 60 58 } … … 92 90 }; 93 91 94 enum coroutine_state { Halted, Start, Primed, Inactive, 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 92 enum coroutine_state { Halted, Start, Inactive, Active, Primed }; 93 94 struct coroutine_desc { 95 // context that is switch during a CtxSwitch 99 96 struct __stack_context_t context; 100 97 … … 109 106 110 107 // first coroutine to resume this one 111 struct $coroutine* starter;108 struct coroutine_desc * starter; 112 109 113 110 // last coroutine to resume this one 114 struct $coroutine* last;111 struct coroutine_desc * last; 115 112 116 113 // If non-null stack must be unwound with this exception … … 128 125 }; 129 126 130 struct $monitor{127 struct monitor_desc { 131 128 // spinlock to protect internal data 132 129 struct __spinlock_t lock; 133 130 134 131 // current owner of the monitor 135 struct $thread* owner;132 struct thread_desc * owner; 136 133 137 134 // queue of threads that are blocked waiting for the monitor 138 __queue_t(struct $thread) entry_queue;135 __queue_t(struct thread_desc) entry_queue; 139 136 140 137 // stack of conditions to run next once we exit the monitor … … 153 150 struct __monitor_group_t { 154 151 // currently held monitors 155 __cfa_anonymous_object( __small_array_t( $monitor*) );152 __cfa_anonymous_object( __small_array_t(monitor_desc*) ); 156 153 157 154 // last function that acquired monitors … … 159 156 }; 160 157 161 struct $thread{158 struct thread_desc { 162 159 // Core threading fields 163 // context that is switch during a __cfactx_switch160 // context that is switch during a CtxSwitch 164 161 struct __stack_context_t context; 165 162 166 163 // current execution status for coroutine 167 volatile int state; 168 enum __Preemption_Reason preempted; 164 enum coroutine_state state; 169 165 170 166 //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it 171 167 172 168 // coroutine body used to store context 173 struct $coroutineself_cor;169 struct coroutine_desc self_cor; 174 170 175 171 // current active context 176 struct $coroutine* curr_cor;172 struct coroutine_desc * curr_cor; 177 173 178 174 // monitor body used for mutual exclusion 179 struct $monitorself_mon;175 struct monitor_desc self_mon; 180 176 181 177 // pointer to monitor with sufficient lifetime for current monitors 182 struct $monitor* self_mon_p;178 struct monitor_desc * self_mon_p; 183 179 184 180 // pointer to the cluster on which the thread is running … … 190 186 // Link lists fields 191 187 // instrusive link field for threads 192 struct $thread* next;188 struct thread_desc * next; 193 189 194 190 struct { 195 struct $thread* next;196 struct $thread* prev;191 struct thread_desc * next; 192 struct thread_desc * prev; 197 193 } node; 198 194 }; … … 200 196 #ifdef __cforall 201 197 extern "Cforall" { 202 static inline $thread *& get_next( $thread & this ) __attribute__((const)) {198 static inline thread_desc *& get_next( thread_desc & this ) { 203 199 return this.next; 204 200 } 205 201 206 static inline [ $thread *&, $thread *& ] __get( $thread & this ) __attribute__((const)) {202 static inline [thread_desc *&, thread_desc *& ] __get( thread_desc & this ) { 207 203 return this.node.[next, prev]; 208 204 } 209 205 210 206 static inline void ?{}(__monitor_group_t & this) { 211 (this.data){ 0p};207 (this.data){NULL}; 212 208 (this.size){0}; 213 209 (this.func){NULL}; 214 210 } 215 211 216 static inline void ?{}(__monitor_group_t & this, struct $monitor** data, __lock_size_t size, fptr_t func) {212 static inline void ?{}(__monitor_group_t & this, struct monitor_desc ** data, __lock_size_t size, fptr_t func) { 217 213 (this.data){data}; 218 214 (this.size){size}; … … 220 216 } 221 217 222 static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) __attribute__((const)){218 static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) { 223 219 if( (lhs.data != 0) != (rhs.data != 0) ) return false; 224 220 if( lhs.size != rhs.size ) return false; … … 254 250 255 251 // assembler routines that performs the context switch 256 extern void __cfactx_invoke_stub( void );257 extern void __cfactx_switch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("__cfactx_switch");252 extern void CtxInvokeStub( void ); 253 extern void CtxSwitch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("CtxSwitch"); 258 254 // void CtxStore ( void * this ) asm ("CtxStore"); 259 255 // void CtxRet ( void * dst ) asm ("CtxRet");
Note:
See TracChangeset
for help on using the changeset viewer.