Ignore:
Timestamp:
May 11, 2018, 10:42:09 AM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, with_gc
Children:
78af962
Parents:
afd550c
Message:

some more work on kernel doubly linked lists and fixed segfault in abort message

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/kernel

    rafd550c rde94a60  
    4040
    4141//-----------------------------------------------------------------------------
    42 // Cluster
    43 struct cluster {
    44         // Ready queue locks
    45         __spinlock_t ready_queue_lock;
     42// Processor
     43extern struct cluster * mainCluster;
    4644
    47         // Ready queue for threads
    48         __queue_t(thread_desc) ready_queue;
    49 
    50         // Name of the cluster
    51         const char * name;
    52 
    53         // Preemption rate on this cluster
    54         Duration preemption_rate;
    55 
    56         // List of idle processors
    57         // __dllist_t(struct processor) idles;
    58 };
    59 
    60 extern struct cluster * mainCluster;
    61 extern Duration default_preemption();
    62 
    63 void ?{} (cluster & this, const char * name, Duration preemption_rate);
    64 void ^?{}(cluster & this);
    65 
    66 static inline void ?{} (cluster & this)                           { this{"Anonymous Cluster", default_preemption()}; }
    67 static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; }
    68 static inline void ?{} (cluster & this, const char * name)        { this{name, default_preemption()}; }
    69 
    70 //-----------------------------------------------------------------------------
    71 // Processor
    7245enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule };
    7346
     
    10174
    10275        // Cluster from which to get threads
    103         cluster * cltr;
     76        struct cluster * cltr;
    10477
    10578        // Name of the processor
     
    127100        bool pending_preemption;
    128101
     102        // Idle lock
     103
     104        // Link lists fields
    129105        struct {
    130                 pthread_mutex_t lock;
    131                 pthread_cond_t  cond;
    132         } idle;
     106                struct processor * next;
     107                struct processor * prev;
     108        } node;
    133109
    134110#ifdef __CFA_DEBUG__
     
    138114};
    139115
    140 void  ?{}(processor & this, const char * name, cluster & cltr);
     116void  ?{}(processor & this, const char * name, struct cluster & cltr);
    141117void ^?{}(processor & this);
    142118
    143119static inline void  ?{}(processor & this)                    { this{ "Anonymous Processor", *mainCluster}; }
    144 static inline void  ?{}(processor & this, cluster & cltr)    { this{ "Anonymous Processor", cltr}; }
     120static inline void  ?{}(processor & this, struct cluster & cltr)    { this{ "Anonymous Processor", cltr}; }
    145121static inline void  ?{}(processor & this, const char * name) { this{name, *mainCluster }; }
     122
     123static inline [processor *&, processor *& ] __get( processor & this ) {
     124        return this.node.[next, prev];
     125}
     126
     127//-----------------------------------------------------------------------------
     128// Cluster
     129struct cluster {
     130        // Ready queue locks
     131        __spinlock_t ready_queue_lock;
     132
     133        // Ready queue for threads
     134        __queue_t(thread_desc) ready_queue;
     135
     136        // Name of the cluster
     137        const char * name;
     138
     139        // Preemption rate on this cluster
     140        Duration preemption_rate;
     141
     142        // List of processors
     143        __spinlock_t proc_list_lock;
     144        __dllist_t(struct processor) procs;
     145        __dllist_t(struct processor) idles;
     146
     147        // Link lists fields
     148        struct {
     149                cluster * next;
     150                cluster * prev;
     151        } node;
     152};
     153extern Duration default_preemption();
     154
     155void ?{} (cluster & this, const char * name, Duration preemption_rate);
     156void ^?{}(cluster & this);
     157
     158static inline void ?{} (cluster & this)                           { this{"Anonymous Cluster", default_preemption()}; }
     159static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; }
     160static inline void ?{} (cluster & this, const char * name)        { this{name, default_preemption()}; }
     161
     162static inline [cluster *&, cluster *& ] __get( cluster & this ) {
     163        return this.node.[next, prev];
     164}
    146165
    147166// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.