Changeset e84ab3d for libcfa/src/concurrency/invoke.h
- Timestamp:
- Jul 5, 2021, 4:44:20 PM (3 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 7f62b708
- Parents:
- ee23a8d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
ree23a8d re84ab3d 71 71 enum __Coroutine_State { Halted, Start, Primed, Blocked, Ready, Active, Cancelled, Halting }; 72 72 73 struct $coroutine{73 struct coroutine$ { 74 74 // context that is switch during a __cfactx_switch 75 75 struct __stack_context_t context; … … 85 85 86 86 // first coroutine to resume this one 87 struct $coroutine* starter;87 struct coroutine$ * starter; 88 88 89 89 // last coroutine to resume this one 90 struct $coroutine* last;90 struct coroutine$ * last; 91 91 92 92 // If non-null stack must be unwound with this exception … … 95 95 }; 96 96 // Wrapper for gdb 97 struct cfathread_coroutine_t { struct $coroutinedebug; };98 99 static inline struct __stack_t * __get_stack( struct $coroutine* cor ) {97 struct cfathread_coroutine_t { struct coroutine$ debug; }; 98 99 static inline struct __stack_t * __get_stack( struct coroutine$ * cor ) { 100 100 return (struct __stack_t*)(((uintptr_t)cor->stack.storage) & ((uintptr_t)-2)); 101 101 } … … 110 110 }; 111 111 112 struct $monitor{112 struct monitor$ { 113 113 // spinlock to protect internal data 114 114 struct __spinlock_t lock; 115 115 116 116 // current owner of the monitor 117 struct $thread* owner;117 struct thread$ * owner; 118 118 119 119 // queue of threads that are blocked waiting for the monitor 120 __queue_t(struct $thread) entry_queue;120 __queue_t(struct thread$) entry_queue; 121 121 122 122 // stack of conditions to run next once we exit the monitor … … 133 133 }; 134 134 // Wrapper for gdb 135 struct cfathread_monitor_t { struct $monitordebug; };135 struct cfathread_monitor_t { struct monitor$ debug; }; 136 136 137 137 struct __monitor_group_t { 138 138 // currently held monitors 139 __cfa_anonymous_object( __small_array_t( $monitor*) );139 __cfa_anonymous_object( __small_array_t(monitor$*) ); 140 140 141 141 // last function that acquired monitors … … 146 146 // instrusive link field for threads 147 147 struct __thread_desc_link { 148 struct $thread* next;148 struct thread$ * next; 149 149 volatile unsigned long long ts; 150 150 }; 151 151 152 struct $thread{152 struct thread$ { 153 153 // Core threading fields 154 154 // context that is switch during a __cfactx_switch … … 179 179 180 180 // coroutine body used to store context 181 struct $coroutineself_cor;181 struct coroutine$ self_cor; 182 182 183 183 // current active context 184 struct $coroutine* curr_cor;184 struct coroutine$ * curr_cor; 185 185 186 186 // monitor body used for mutual exclusion 187 struct $monitorself_mon;187 struct monitor$ self_mon; 188 188 189 189 // pointer to monitor with sufficient lifetime for current monitors 190 struct $monitor* self_mon_p;190 struct monitor$ * self_mon_p; 191 191 192 192 // monitors currently held by this thread … … 195 195 // used to put threads on user data structures 196 196 struct { 197 struct $thread* next;198 struct $thread* back;197 struct thread$ * next; 198 struct thread$ * back; 199 199 } seqable; 200 200 201 201 // used to put threads on dlist data structure 202 __cfa_dlink( $thread);202 __cfa_dlink(thread$); 203 203 204 204 struct { 205 struct $thread* next;206 struct $thread* prev;205 struct thread$ * next; 206 struct thread$ * prev; 207 207 } node; 208 208 … … 214 214 }; 215 215 #ifdef __cforall 216 P9_EMBEDDED( $thread, dlink($thread) )216 P9_EMBEDDED( thread$, dlink(thread$) ) 217 217 #endif 218 218 // Wrapper for gdb 219 struct cfathread_thread_t { struct $threaddebug; };219 struct cfathread_thread_t { struct thread$ debug; }; 220 220 221 221 #ifdef __CFA_DEBUG__ 222 void __cfaabi_dbg_record_thrd( $thread& this, bool park, const char prev_name[]);222 void __cfaabi_dbg_record_thrd(thread$ & this, bool park, const char prev_name[]); 223 223 #else 224 224 #define __cfaabi_dbg_record_thrd(x, y, z) … … 228 228 extern "Cforall" { 229 229 230 static inline $thread *& get_next( $thread& this ) __attribute__((const)) {230 static inline thread$ *& get_next( thread$ & this ) __attribute__((const)) { 231 231 return this.link.next; 232 232 } 233 233 234 static inline [ $thread *&, $thread *& ] __get( $thread& this ) __attribute__((const)) {234 static inline [thread$ *&, thread$ *& ] __get( thread$ & this ) __attribute__((const)) { 235 235 return this.node.[next, prev]; 236 236 } 237 237 238 static inline $thread * volatile & ?`next ( $thread* this ) __attribute__((const)) {238 static inline thread$ * volatile & ?`next ( thread$ * this ) __attribute__((const)) { 239 239 return this->seqable.next; 240 240 } 241 241 242 static inline $thread *& Back( $thread* this ) __attribute__((const)) {242 static inline thread$ *& Back( thread$ * this ) __attribute__((const)) { 243 243 return this->seqable.back; 244 244 } 245 245 246 static inline $thread *& Next( $thread* this ) __attribute__((const)) {246 static inline thread$ *& Next( thread$ * this ) __attribute__((const)) { 247 247 return this->seqable.next; 248 248 } 249 249 250 static inline bool listed( $thread* this ) {250 static inline bool listed( thread$ * this ) { 251 251 return this->seqable.next != 0p; 252 252 } … … 258 258 } 259 259 260 static inline void ?{}(__monitor_group_t & this, struct $monitor** data, __lock_size_t size, fptr_t func) {260 static inline void ?{}(__monitor_group_t & this, struct monitor$ ** data, __lock_size_t size, fptr_t func) { 261 261 (this.data){data}; 262 262 (this.size){size};
Note: See TracChangeset
for help on using the changeset viewer.