- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.hfa
rd76bd79 r7768b8d 20 20 #include "invoke.h" 21 21 #include "time_t.hfa" 22 #include "coroutine.hfa"23 22 24 23 extern "C" { … … 107 106 // Cluster from which to get threads 108 107 struct cluster * cltr; 108 unsigned int id; 109 109 110 110 // Name of the processor … … 158 158 } 159 159 160 161 //----------------------------------------------------------------------------- 162 // Cluster Tools 163 struct __processor_id; 164 165 // Reader-Writer lock protecting the ready-queue 166 struct __clusterRWLock_t { 167 // total cachelines allocated 168 unsigned int max; 169 170 // cachelines currently in use 171 volatile unsigned int alloc; 172 173 // cachelines ready to itereate over 174 // (!= to alloc when thread is in second half of doregister) 175 volatile unsigned int ready; 176 177 // writer lock 178 volatile bool lock; 179 180 // data pointer 181 __processor_id * data; 182 }; 183 184 void ?{}(__clusterRWLock_t & this); 185 void ^?{}(__clusterRWLock_t & this); 186 187 // Underlying sub quues of the ready queue 188 struct __attribute__((aligned(128))) __intrusive_ready_queue_t { 189 // spin lock protecting the queue 190 volatile bool lock; 191 192 // anchor for the head and the tail of the queue 193 struct __sentinel_t { 194 struct thread_desc * next; 195 struct thread_desc * prev; 196 unsigned long long ts; 197 } before, after; 198 199 // Optional statistic counters 200 #ifndef __CFA_NO_SCHED_STATS__ 201 struct __attribute__((aligned(64))) { 202 // difference between number of push and pops 203 ssize_t diff; 204 205 // total number of pushes and pops 206 size_t push; 207 size_t pop ; 208 } stat; 209 #endif 210 }; 211 212 void ?{}(__intrusive_ready_queue_t & this); 213 void ^?{}(__intrusive_ready_queue_t & this); 214 160 215 //----------------------------------------------------------------------------- 161 216 // Cluster 162 217 struct cluster { 163 218 // Ready queue locks 164 __ spinlock_t ready_queue_lock;219 __clusterRWLock_t ready_lock; 165 220 166 221 // Ready queue for threads 167 __ queue_t(thread_desc)ready_queue;222 __intrusive_ready_queue_t ready_queue; 168 223 169 224 // Name of the cluster … … 175 230 // List of processors 176 231 __spinlock_t proc_list_lock; 177 __dllist_t(struct processor) procs;178 232 __dllist_t(struct processor) idles; 179 unsigned int nprocessors;180 233 181 234 // List of threads
Note: See TracChangeset
for help on using the changeset viewer.