- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.hfa
r92e7631 rd4e68a6 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 4 12:29:26 202013 // Update Count : 2212 // Last Modified On : Sat Jun 22 11:39:17 2019 13 // Update Count : 16 14 14 // 15 15 … … 20 20 #include "invoke.h" 21 21 #include "time_t.hfa" 22 #include "coroutine.hfa"23 22 24 23 extern "C" { … … 32 31 __spinlock_t lock; 33 32 int count; 34 __queue_t( $thread) waiting;33 __queue_t(thread_desc) waiting; 35 34 }; 36 35 … … 38 37 void ^?{}(semaphore & this); 39 38 void P (semaphore & this); 40 boolV (semaphore & this);39 void V (semaphore & this); 41 40 42 41 … … 44 43 // Processor 45 44 extern struct cluster * mainCluster; 45 46 enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule, Callback }; 47 48 typedef void (*__finish_callback_fptr_t)(void); 49 50 //TODO use union, many of these fields are mutually exclusive (i.e. MULTI vs NOMULTI) 51 struct FinishAction { 52 FinishOpCode action_code; 53 /* 54 // Union of possible actions 55 union { 56 // Option 1 : locks and threads 57 struct { 58 // 1 thread or N thread 59 union { 60 thread_desc * thrd; 61 struct { 62 thread_desc ** thrds; 63 unsigned short thrd_count; 64 }; 65 }; 66 // 1 lock or N lock 67 union { 68 __spinlock_t * lock; 69 struct { 70 __spinlock_t ** locks; 71 unsigned short lock_count; 72 }; 73 }; 74 }; 75 // Option 2 : action pointer 76 __finish_callback_fptr_t callback; 77 }; 78 /*/ 79 thread_desc * thrd; 80 thread_desc ** thrds; 81 unsigned short thrd_count; 82 __spinlock_t * lock; 83 __spinlock_t ** locks; 84 unsigned short lock_count; 85 __finish_callback_fptr_t callback; 86 //*/ 87 }; 88 static inline void ?{}(FinishAction & this) { 89 this.action_code = No_Action; 90 this.thrd = NULL; 91 this.lock = NULL; 92 } 93 static inline void ^?{}(FinishAction &) {} 46 94 47 95 // Processor … … 67 115 // RunThread data 68 116 // Action to do after a thread is ran 69 $thread * destroyer;117 struct FinishAction finish; 70 118 71 119 // Preemption data … … 76 124 bool pending_preemption; 77 125 78 // Idle lock (kernel semaphore)79 __bin_sem_t idle ;126 // Idle lock 127 __bin_sem_t idleLock; 80 128 81 129 // Termination … … 83 131 volatile bool do_terminate; 84 132 85 // Termination synchronisation (user semaphore)133 // Termination synchronisation 86 134 semaphore terminated; 87 88 // pthread Stack89 void * stack;90 135 91 136 // Link lists fields … … 101 146 }; 102 147 103 void ?{}(processor & this, const char name[], struct cluster & cltr);148 void ?{}(processor & this, const char * name, struct cluster & cltr); 104 149 void ^?{}(processor & this); 105 150 106 151 static inline void ?{}(processor & this) { this{ "Anonymous Processor", *mainCluster}; } 107 152 static inline void ?{}(processor & this, struct cluster & cltr) { this{ "Anonymous Processor", cltr}; } 108 static inline void ?{}(processor & this, const char name[]) { this{name, *mainCluster }; } 109 110 static inline [processor *&, processor *& ] __get( processor & this ) __attribute__((const)) { return this.node.[next, prev]; } 153 static inline void ?{}(processor & this, const char * name) { this{name, *mainCluster }; } 154 155 static inline [processor *&, processor *& ] __get( processor & this ) { 156 return this.node.[next, prev]; 157 } 111 158 112 159 //----------------------------------------------------------------------------- … … 117 164 118 165 // Ready queue for threads 119 __queue_t( $thread) ready_queue;166 __queue_t(thread_desc) ready_queue; 120 167 121 168 // Name of the cluster … … 126 173 127 174 // List of processors 128 __spinlock_t idle_lock;175 __spinlock_t proc_list_lock; 129 176 __dllist_t(struct processor) procs; 130 177 __dllist_t(struct processor) idles; … … 133 180 // List of threads 134 181 __spinlock_t thread_list_lock; 135 __dllist_t(struct $thread) threads;182 __dllist_t(struct thread_desc) threads; 136 183 unsigned int nthreads; 137 184 … … 144 191 extern Duration default_preemption(); 145 192 146 void ?{} (cluster & this, const char name[], Duration preemption_rate);193 void ?{} (cluster & this, const char * name, Duration preemption_rate); 147 194 void ^?{}(cluster & this); 148 195 149 196 static inline void ?{} (cluster & this) { this{"Anonymous Cluster", default_preemption()}; } 150 197 static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; } 151 static inline void ?{} (cluster & this, const char name[]) { this{name, default_preemption()}; } 152 153 static inline [cluster *&, cluster *& ] __get( cluster & this ) __attribute__((const)) { return this.node.[next, prev]; } 198 static inline void ?{} (cluster & this, const char * name) { this{name, default_preemption()}; } 199 200 static inline [cluster *&, cluster *& ] __get( cluster & this ) { 201 return this.node.[next, prev]; 202 } 154 203 155 204 static inline struct processor * active_processor() { return TL_GET( this_processor ); } // UNSAFE
Note:
See TracChangeset
for help on using the changeset viewer.