Ignore:
Timestamp:
Aug 17, 2022, 4:34:10 PM (3 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, ast-experimental, master, pthread-emulation
Children:
ff370d8
Parents:
3ce3fb9 (diff), 683cc13 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

fix conflict from pull

Location:
libcfa/src/concurrency/kernel
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/cluster.cfa

    r3ce3fb9 r36cc24a  
    9393//=======================================================================
    9494void  ?{}(__scheduler_RWLock_t & this) {
    95         this.max   = __max_processors();
    96         this.alloc = 0;
    97         this.ready = 0;
    98         this.data  = alloc(this.max);
    99         this.write_lock  = false;
    100 
    101         /*paranoid*/ verify(__atomic_is_lock_free(sizeof(this.alloc), &this.alloc));
    102         /*paranoid*/ verify(__atomic_is_lock_free(sizeof(this.ready), &this.ready));
     95        this.lock.max   = __max_processors();
     96        this.lock.alloc = 0;
     97        this.lock.ready = 0;
     98        this.lock.data  = alloc(this.lock.max);
     99        this.lock.write_lock  = false;
     100
     101        /*paranoid*/ verify(__atomic_is_lock_free(sizeof(this.lock.alloc), &this.lock.alloc));
     102        /*paranoid*/ verify(__atomic_is_lock_free(sizeof(this.lock.ready), &this.lock.ready));
    103103
    104104}
    105105void ^?{}(__scheduler_RWLock_t & this) {
    106         free(this.data);
     106        free(this.lock.data);
    107107}
    108108
     
    110110//=======================================================================
    111111// Lock-Free registering/unregistering of threads
    112 unsigned register_proc_id( void ) with(*__scheduler_lock) {
     112unsigned register_proc_id( void ) with(__scheduler_lock.lock) {
    113113        __kernel_rseq_register();
    114114
     
    132132        }
    133133
    134         if(max <= alloc) abort("Trying to create more than %ud processors", __scheduler_lock->max);
     134        if(max <= alloc) abort("Trying to create more than %ud processors", __scheduler_lock.lock.max);
    135135
    136136        // Step - 2 : F&A to get a new spot in the array.
    137137        uint_fast32_t n = __atomic_fetch_add(&alloc, 1, __ATOMIC_SEQ_CST);
    138         if(max <= n) abort("Trying to create more than %ud processors", __scheduler_lock->max);
     138        if(max <= n) abort("Trying to create more than %ud processors", __scheduler_lock.lock.max);
    139139
    140140        // Step - 3 : Mark space as used and then publish it.
     
    154154}
    155155
    156 void unregister_proc_id( unsigned id ) with(*__scheduler_lock) {
     156void unregister_proc_id( unsigned id ) with(__scheduler_lock.lock) {
    157157        /* paranoid */ verify(id < ready);
    158158        /* paranoid */ verify(id == kernelTLS().sched_id);
     
    169169// Writer side : acquire when changing the ready queue, e.g. adding more
    170170//  queues or removing them.
    171 uint_fast32_t ready_mutate_lock( void ) with(*__scheduler_lock) {
     171uint_fast32_t ready_mutate_lock( void ) with(__scheduler_lock.lock) {
    172172        /* paranoid */ verify( ! __preemption_enabled() );
    173173
     
    196196}
    197197
    198 void ready_mutate_unlock( uint_fast32_t last_s ) with(*__scheduler_lock) {
     198void ready_mutate_unlock( uint_fast32_t last_s ) with(__scheduler_lock.lock) {
    199199        /* paranoid */ verify( ! __preemption_enabled() );
    200200
  • libcfa/src/concurrency/kernel/cluster.hfa

    r3ce3fb9 r36cc24a  
    2424// Calc moving average based on existing average, before and current time.
    2525static inline unsigned long long moving_average(unsigned long long currtsc, unsigned long long instsc, unsigned long long old_avg) {
    26         /* paranoid */ verifyf( currtsc < 45000000000000000, "Suspiciously large current time: %'llu (%llx)\n", currtsc, currtsc );
    27         /* paranoid */ verifyf( instsc  < 45000000000000000, "Suspiciously large insert time: %'llu (%llx)\n", instsc, instsc );
    2826        /* paranoid */ verifyf( old_avg < 15000000000000, "Suspiciously large previous average: %'llu (%llx)\n", old_avg, old_avg );
    2927
  • libcfa/src/concurrency/kernel/private.hfa

    r3ce3fb9 r36cc24a  
    184184// have been hard-coded to for the ready-queue for
    185185// simplicity and performance
    186 struct __scheduler_RWLock_t {
    187         // total cachelines allocated
    188         unsigned int max;
    189 
    190         // cachelines currently in use
    191         volatile unsigned int alloc;
    192 
    193         // cachelines ready to itereate over
    194         // (!= to alloc when thread is in second half of doregister)
    195         volatile unsigned int ready;
    196 
    197         // writer lock
    198         volatile bool write_lock;
    199 
    200         // data pointer
    201         volatile bool * volatile * data;
     186union __attribute__((aligned(64))) __scheduler_RWLock_t {
     187        struct {
     188                __attribute__((aligned(64))) char padding;
     189
     190                // total cachelines allocated
     191                __attribute__((aligned(64))) unsigned int max;
     192
     193                // cachelines currently in use
     194                volatile unsigned int alloc;
     195
     196                // cachelines ready to itereate over
     197                // (!= to alloc when thread is in second half of doregister)
     198                volatile unsigned int ready;
     199
     200                // writer lock
     201                volatile bool write_lock;
     202
     203                // data pointer
     204                volatile bool * volatile * data;
     205        } lock;
     206        char pad[192];
    202207};
    203208
     
    205210void ^?{}(__scheduler_RWLock_t & this);
    206211
    207 extern __scheduler_RWLock_t * __scheduler_lock;
     212extern __scheduler_RWLock_t __scheduler_lock;
    208213
    209214//-----------------------------------------------------------------------
    210215// Reader side : acquire when using the ready queue to schedule but not
    211216//  creating/destroying queues
    212 static inline void ready_schedule_lock(void) with(*__scheduler_lock) {
     217static inline void ready_schedule_lock(void) with(__scheduler_lock.lock) {
    213218        /* paranoid */ verify( ! __preemption_enabled() );
    214219        /* paranoid */ verify( ! kernelTLS().in_sched_lock );
     
    235240}
    236241
    237 static inline void ready_schedule_unlock(void) with(*__scheduler_lock) {
     242static inline void ready_schedule_unlock(void) with(__scheduler_lock.lock) {
    238243        /* paranoid */ verify( ! __preemption_enabled() );
    239244        /* paranoid */ verify( data[kernelTLS().sched_id] == &kernelTLS().sched_lock );
     
    256261
    257262        static inline bool ready_mutate_islocked() {
    258                 return __scheduler_lock->write_lock;
     263                return __scheduler_lock.lock.write_lock;
    259264        }
    260265#endif
  • libcfa/src/concurrency/kernel/startup.cfa

    r3ce3fb9 r36cc24a  
    113113KERNEL_STORAGE(thread$,              mainThread);
    114114KERNEL_STORAGE(__stack_t,            mainThreadCtx);
    115 KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock);
     115// KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock);
    116116KERNEL_STORAGE(eventfd_t,            mainIdleEventFd);
    117117KERNEL_STORAGE(io_future_t,          mainIdleFuture);
     
    123123processor            * mainProcessor;
    124124thread$              * mainThread;
    125 __scheduler_RWLock_t * __scheduler_lock;
    126125
    127126extern "C" {
     
    148147};
    149148
     149__scheduler_RWLock_t __scheduler_lock @= { 0 };
     150
    150151#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
    151152        // No data needed
     
    198199
    199200        // Initialize the global scheduler lock
    200         __scheduler_lock = (__scheduler_RWLock_t*)&storage___scheduler_lock;
    201         (*__scheduler_lock){};
     201        // __scheduler_lock = (__scheduler_RWLock_t*)&storage___scheduler_lock;
     202        (__scheduler_lock){};
    202203
    203204        // Initialize the main cluster
     
    336337        ^(*mainCluster){};
    337338
    338         ^(*__scheduler_lock){};
     339        ^(__scheduler_lock){};
    339340
    340341        ^(__cfa_dbg_global_clusters.list){};
Note: See TracChangeset for help on using the changeset viewer.