Changeset 58fe85a for libcfa/src/concurrency/invoke.h
- Timestamp:
- Jan 7, 2021, 3:27:00 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 2b4daf2, 64aeca0
- Parents:
- 3c64c668 (diff), eef8dfb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
r3c64c668 r58fe85a 17 17 #include "bits/defs.hfa" 18 18 #include "bits/locks.hfa" 19 #include "kernel/fwd.hfa" 19 20 20 21 #ifdef __cforall … … 26 27 #define _INVOKE_H_ 27 28 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 * 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 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 }; 62 35 63 36 struct __stack_context_t { … … 85 58 // base of stack 86 59 void * base; 60 61 // Information for exception handling. 62 struct exception_context_t exception_context; 87 63 }; 88 64 … … 92 68 }; 93 69 94 enum coroutine_state { Halted, Start, Primed, Inactive, Active, Rerun }; 95 enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION }; 70 enum __Coroutine_State { Halted, Start, Primed, Blocked, Ready, Active, Cancelled, Halting }; 96 71 97 72 struct $coroutine { … … 106 81 107 82 // current execution status for coroutine 108 enum coroutine_state state;83 enum __Coroutine_State state; 109 84 110 85 // first coroutine to resume this one … … 118 93 119 94 }; 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 } 120 101 121 102 // struct which calls the monitor is accepting … … 150 131 struct __condition_node_t * dtor_node; 151 132 }; 133 // Wrapper for gdb 134 struct cfathread_monitor_t { struct $monitor debug; }; 152 135 153 136 struct __monitor_group_t { … … 157 140 // last function that acquired monitors 158 141 fptr_t func; 142 }; 143 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; 159 151 }; 160 152 … … 165 157 166 158 // current execution status for coroutine 167 volatile int state; 168 enum __Preemption_Reason preempted; 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; 169 166 170 167 //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it 168 169 // pointer to the cluster on which the thread is running 170 struct cluster * curr_cluster; 171 172 // Link lists fields 173 // instrusive link field for threads 174 struct __thread_desc_link link; 171 175 172 176 // coroutine body used to store context … … 182 186 struct $monitor * self_mon_p; 183 187 184 // pointer to the cluster on which the thread is running185 struct cluster * curr_cluster;186 187 188 // monitors currently held by this thread 188 189 struct __monitor_group_t monitors; 189 190 190 // Link lists fields 191 // instrusive link field for threads 192 struct $thread * next; 191 // used to put threads on user data structures 192 struct { 193 struct $thread * next; 194 struct $thread * back; 195 } seqable; 193 196 194 197 struct { … … 196 199 struct $thread * prev; 197 200 } node; 198 }; 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 199 214 200 215 #ifdef __cforall 201 216 extern "Cforall" { 217 202 218 static inline $thread *& get_next( $thread & this ) __attribute__((const)) { 203 return this. next;219 return this.link.next; 204 220 } 205 221 206 222 static inline [$thread *&, $thread *& ] __get( $thread & this ) __attribute__((const)) { 207 223 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; 208 236 } 209 237
Note:
See TracChangeset
for help on using the changeset viewer.