- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.hfa (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.hfa
rac2b598 re3fea42 32 32 __spinlock_t lock; 33 33 int count; 34 __queue_t( $thread) waiting;34 __queue_t(thread_desc) waiting; 35 35 }; 36 36 … … 44 44 // Processor 45 45 extern struct cluster * mainCluster; 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 actions 56 union { 57 // Option 1 : locks and threads 58 struct { 59 // 1 thread or N thread 60 union { 61 thread_desc * thrd; 62 struct { 63 thread_desc ** thrds; 64 unsigned short thrd_count; 65 }; 66 }; 67 // 1 lock or N lock 68 union { 69 __spinlock_t * lock; 70 struct { 71 __spinlock_t ** locks; 72 unsigned short lock_count; 73 }; 74 }; 75 }; 76 // Option 2 : action pointer 77 __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 &) {} 46 95 47 96 // Processor … … 67 116 // RunThread data 68 117 // Action to do after a thread is ran 69 $thread * destroyer;118 struct FinishAction finish; 70 119 71 120 // Preemption data … … 108 157 static inline void ?{}(processor & this, const char name[]) { this{name, *mainCluster }; } 109 158 110 static inline [processor *&, processor *& ] __get( processor & this ) __attribute__((const)) { return this.node.[next, prev]; } 159 static inline [processor *&, processor *& ] __get( processor & this ) { 160 return this.node.[next, prev]; 161 } 111 162 112 163 //----------------------------------------------------------------------------- … … 117 168 118 169 // Ready queue for threads 119 __queue_t( $thread) ready_queue;170 __queue_t(thread_desc) ready_queue; 120 171 121 172 // Name of the cluster … … 133 184 // List of threads 134 185 __spinlock_t thread_list_lock; 135 __dllist_t(struct $thread) threads;186 __dllist_t(struct thread_desc) threads; 136 187 unsigned int nthreads; 137 188 … … 151 202 static inline void ?{} (cluster & this, const char name[]) { this{name, default_preemption()}; } 152 203 153 static inline [cluster *&, cluster *& ] __get( cluster & this ) __attribute__((const)) { return this.node.[next, prev]; } 204 static inline [cluster *&, cluster *& ] __get( cluster & this ) { 205 return this.node.[next, prev]; 206 } 154 207 155 208 static inline struct processor * active_processor() { return TL_GET( this_processor ); } // UNSAFE
Note:
See TracChangeset
for help on using the changeset viewer.