- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.hfa (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.hfa
re3fea42 r8c50aed 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 : Wed Dec 4 07:54:51 2019 13 // Update Count : 18 14 14 // 15 15 … … 45 45 extern struct cluster * mainCluster; 46 46 47 enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule, Callback };48 49 typedef void (*__finish_callback_fptr_t)(void);50 51 //TODO use union, many of these fields are mutually exclusive (i.e. MULTI vs NOMULTI)52 struct FinishAction {53 FinishOpCode action_code;54 /*55 // Union of possible actions56 union {57 // Option 1 : locks and threads58 struct {59 // 1 thread or N thread60 union {61 thread_desc * thrd;62 struct {63 thread_desc ** thrds;64 unsigned short thrd_count;65 };66 };67 // 1 lock or N lock68 union {69 __spinlock_t * lock;70 struct {71 __spinlock_t ** locks;72 unsigned short lock_count;73 };74 };75 };76 // Option 2 : action pointer77 __finish_callback_fptr_t callback;78 };79 /*/80 thread_desc * thrd;81 thread_desc ** thrds;82 unsigned short thrd_count;83 __spinlock_t * lock;84 __spinlock_t ** locks;85 unsigned short lock_count;86 __finish_callback_fptr_t callback;87 //*/88 };89 static inline void ?{}(FinishAction & this) {90 this.action_code = No_Action;91 this.thrd = 0p;92 this.lock = 0p;93 }94 static inline void ^?{}(FinishAction &) {}95 96 47 // Processor 97 48 coroutine processorCtx_t { … … 116 67 // RunThread data 117 68 // Action to do after a thread is ran 118 struct FinishAction finish;69 thread_desc * destroyer; 119 70 120 71 // Preemption data … … 150 101 }; 151 102 152 void ?{}(processor & this, const char name[], struct cluster & cltr);103 void ?{}(processor & this, const char * name, struct cluster & cltr); 153 104 void ^?{}(processor & this); 154 105 155 106 static inline void ?{}(processor & this) { this{ "Anonymous Processor", *mainCluster}; } 156 107 static inline void ?{}(processor & this, struct cluster & cltr) { this{ "Anonymous Processor", cltr}; } 157 static inline void ?{}(processor & this, const char name[]) { this{name, *mainCluster }; }108 static inline void ?{}(processor & this, const char * name) { this{name, *mainCluster }; } 158 109 159 static inline [processor *&, processor *& ] __get( processor & this ) { 160 return this.node.[next, prev]; 161 } 110 static inline [processor *&, processor *& ] __get( processor & this ) /*__attribute__((const))*/ { return this.node.[next, prev]; } 162 111 163 112 //----------------------------------------------------------------------------- … … 195 144 extern Duration default_preemption(); 196 145 197 void ?{} (cluster & this, const char name[], Duration preemption_rate);146 void ?{} (cluster & this, const char * name, Duration preemption_rate); 198 147 void ^?{}(cluster & this); 199 148 200 149 static inline void ?{} (cluster & this) { this{"Anonymous Cluster", default_preemption()}; } 201 150 static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; } 202 static inline void ?{} (cluster & this, const char name[]) { this{name, default_preemption()}; }151 static inline void ?{} (cluster & this, const char * name) { this{name, default_preemption()}; } 203 152 204 static inline [cluster *&, cluster *& ] __get( cluster & this ) { 205 return this.node.[next, prev]; 206 } 153 static inline [cluster *&, cluster *& ] __get( cluster & this ) /*__attribute__((const))*/ { return this.node.[next, prev]; } 207 154 208 static inline struct processor * active_processor() { return TL_GET( this_processor ); } // UNSAFE209 static inline struct cluster * active_cluster () { return TL_GET( this_processor )->cltr; }155 static inline struct processor * active_processor() __attribute__((const)) { return TL_GET( this_processor ); } // UNSAFE 156 static inline struct cluster * active_cluster () __attribute__((const)) { return TL_GET( this_processor )->cltr; } 210 157 211 158 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.