Ignore:
File:
1 edited

Legend:

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

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