diff options
-rw-r--r-- | libddekit/condvar.c | 94 | ||||
-rw-r--r-- | libddekit/include/ddekit/condvar.h | 2 |
2 files changed, 15 insertions, 81 deletions
diff --git a/libddekit/condvar.c b/libddekit/condvar.c index a495cf92..96e28c07 100644 --- a/libddekit/condvar.c +++ b/libddekit/condvar.c @@ -4,105 +4,41 @@ * * \author Thomas Friebel <tf13@os.inf.tu-dresden.de> */ -#include <l4/dde/ddekit/condvar.h> -#include <l4/dde/ddekit/lock.h> -#include <l4/dde/ddekit/memory.h> +#include <cthreads.h> -#include <l4/log/l4log.h> -#include <l4/semaphore/semaphore.h> -#include <l4/lock/lock.h> +#include "ddekit/condvar.h" struct ddekit_condvar { - unsigned waiters; - unsigned signals; - l4lock_t lock; - l4semaphore_t sem; - l4semaphore_t handshake; + struct condition cond; }; ddekit_condvar_t *ddekit_condvar_init() { ddekit_condvar_t *cvp; - cvp = ddekit_simple_malloc(sizeof(*cvp)); - - cvp->waiters = 0; - cvp->signals = 0; - cvp->lock = L4LOCK_UNLOCKED; - cvp->sem = L4SEMAPHORE_INIT(0); - cvp->handshake = L4SEMAPHORE_INIT(0); + cvp = condition_alloc (); + condition_init (cvp); return cvp; } void ddekit_condvar_wait(ddekit_condvar_t *cvp, ddekit_lock_t *mp) { - ddekit_condvar_wait_timed(cvp, mp, -1); + /* This isn't nice. The encapsulation is broken. + * TODO I can merge the two files condvar.c and lock.c. */ + condition_wait (&cvp->cond, (struct mutex *) mp); } -int ddekit_condvar_wait_timed(ddekit_condvar_t *cvp, ddekit_lock_t *mp, int timo) { - int rval; - - l4lock_lock(&cvp->lock); - cvp->waiters++; - l4lock_unlock(&cvp->lock); - - ddekit_lock_unlock(mp); - - if (timo == -1) { - l4semaphore_down(&cvp->sem); - rval = 0; - } else { - rval = l4semaphore_down_timed(&cvp->sem, timo); - } - - l4lock_lock(&cvp->lock); - if (cvp->signals > 0) { - /* if we timed out, but there is a signal now, consume it */ - if (rval) l4semaphore_down(&cvp->sem); - - l4semaphore_up(&cvp->handshake); - cvp->signals--; - } - cvp->waiters--; - l4lock_unlock(&cvp->lock); - - ddekit_lock_lock(mp); - - return rval; +int ddekit_condvar_wait_timed(ddekit_condvar_t *cvp, + ddekit_lock_t *mp, int timo) { + // TODO currently just let it like this. + ddekit_condvar_wait (cvp, mp); + return 0; } void ddekit_condvar_signal(ddekit_condvar_t *cvp) { - l4lock_lock(&cvp->lock); - - if (cvp->waiters > cvp->signals) { - cvp->signals++; - l4semaphore_up(&cvp->sem); - l4lock_unlock(&cvp->lock); - l4semaphore_down(&cvp->handshake); - } else { - /* nobody left to wakeup */ - l4lock_unlock(&cvp->lock); - } + condition_signal (&cvp->cond); } void ddekit_condvar_broadcast(ddekit_condvar_t *cvp) { - int waiters; - - l4lock_lock(&cvp->lock); - - waiters = cvp->waiters - cvp->signals; - if (waiters > 0) { - int i; - - cvp->signals = cvp->waiters; - for (i=0; i<waiters; i++) { - l4semaphore_up(&cvp->sem); - } - l4lock_unlock(&cvp->lock); - for (i=0; i<waiters; i++) { - l4semaphore_down(&cvp->handshake); - } - } else { - l4lock_unlock(&cvp->lock); - } + condition_broadcast (&cvp->cond); } diff --git a/libddekit/include/ddekit/condvar.h b/libddekit/include/ddekit/condvar.h index b6dc4bd3..ba87358d 100644 --- a/libddekit/include/ddekit/condvar.h +++ b/libddekit/include/ddekit/condvar.h @@ -3,8 +3,6 @@ /** \file ddekit/condvar.h */ -#include <l4/dde/ddekit/lock.h> - struct ddekit_condvar; typedef struct ddekit_condvar ddekit_condvar_t; |