Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel.hfa

    r7768b8d rd76bd79  
    2020#include "invoke.h"
    2121#include "time_t.hfa"
     22#include "coroutine.hfa"
    2223
    2324extern "C" {
     
    106107        // Cluster from which to get threads
    107108        struct cluster * cltr;
    108         unsigned int id;
    109109
    110110        // Name of the processor
     
    158158}
    159159
    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 
    215160//-----------------------------------------------------------------------------
    216161// Cluster
    217162struct cluster {
    218163        // Ready queue locks
    219         __clusterRWLock_t ready_lock;
     164        __spinlock_t ready_queue_lock;
    220165
    221166        // Ready queue for threads
    222         __intrusive_ready_queue_t ready_queue;
     167        __queue_t(thread_desc) ready_queue;
    223168
    224169        // Name of the cluster
     
    230175        // List of processors
    231176        __spinlock_t proc_list_lock;
     177        __dllist_t(struct processor) procs;
    232178        __dllist_t(struct processor) idles;
     179        unsigned int nprocessors;
    233180
    234181        // List of threads
Note: See TracChangeset for help on using the changeset viewer.