Ignore:
File:
1 edited

Legend:

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

    rd76bd79 r7768b8d  
    2020#include "invoke.h"
    2121#include "time_t.hfa"
    22 #include "coroutine.hfa"
    2322
    2423extern "C" {
     
    107106        // Cluster from which to get threads
    108107        struct cluster * cltr;
     108        unsigned int id;
    109109
    110110        // Name of the processor
     
    158158}
    159159
     160
     161//-----------------------------------------------------------------------------
     162// Cluster Tools
     163struct __processor_id;
     164
     165// Reader-Writer lock protecting the ready-queue
     166struct __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
     184void  ?{}(__clusterRWLock_t & this);
     185void ^?{}(__clusterRWLock_t & this);
     186
     187// Underlying sub quues of the ready queue
     188struct __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
     212void  ?{}(__intrusive_ready_queue_t & this);
     213void ^?{}(__intrusive_ready_queue_t & this);
     214
    160215//-----------------------------------------------------------------------------
    161216// Cluster
    162217struct cluster {
    163218        // Ready queue locks
    164         __spinlock_t ready_queue_lock;
     219        __clusterRWLock_t ready_lock;
    165220
    166221        // Ready queue for threads
    167         __queue_t(thread_desc) ready_queue;
     222        __intrusive_ready_queue_t ready_queue;
    168223
    169224        // Name of the cluster
     
    175230        // List of processors
    176231        __spinlock_t proc_list_lock;
    177         __dllist_t(struct processor) procs;
    178232        __dllist_t(struct processor) idles;
    179         unsigned int nprocessors;
    180233
    181234        // List of threads
Note: See TracChangeset for help on using the changeset viewer.