Changeset 4069faad for libcfa/src/bits


Ignore:
Timestamp:
May 1, 2020, 12:37:30 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
d45ed83
Parents:
9987d79
Message:

Fix error in benchmark where the wrong fd was used.
Changed behcnmark to use seperate cluster for I/O.
Changed some debug prints to use new versions with groups.
Fixed halting race condition leading to deadlock.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/bits/locks.hfa

    r9987d79 r4069faad  
    113113
    114114        struct __bin_sem_t {
    115                 bool                    signaled;
    116115                pthread_mutex_t         lock;
    117116                pthread_cond_t          cond;
     117                int                     val;
    118118        };
    119119
    120120        static inline void ?{}(__bin_sem_t & this) with( this ) {
    121                 signaled = false;
    122121                pthread_mutex_init(&lock, NULL);
    123122                pthread_cond_init (&cond, NULL);
     123                val = 0;
    124124        }
    125125
     
    132132                verify(__cfaabi_dbg_in_kernel());
    133133                pthread_mutex_lock(&lock);
    134                         if(!signaled) {   // this must be a loop, not if!
     134                        while(val < 1) {
    135135                                pthread_cond_wait(&cond, &lock);
    136136                        }
    137                         signaled = false;
     137                        val -= 1;
    138138                pthread_mutex_unlock(&lock);
    139139        }
    140140
    141141        static inline bool post(__bin_sem_t & this) with( this ) {
     142                bool needs_signal = false;
     143
    142144                pthread_mutex_lock(&lock);
    143                         bool needs_signal = !signaled;
    144                         signaled = true;
     145                        if(val < 1) {
     146                                val += 1;
     147                                pthread_cond_signal(&cond);
     148                                needs_signal = true;
     149                        }
    145150                pthread_mutex_unlock(&lock);
    146 
    147                 if (needs_signal) pthread_cond_signal(&cond);
    148151
    149152                return needs_signal;
Note: See TracChangeset for help on using the changeset viewer.