]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/dde/ddekit/src/condvar.c
Some minor fixes.
[l4.git] / l4 / pkg / dde / ddekit / src / condvar.c
1 /*
2  * This file is part of DDEKit.
3  *
4  * (c) 2006-2012 Bjoern Doebel <doebel@os.inf.tu-dresden.de>
5  *               Christian Helmuth <ch12@os.inf.tu-dresden.de>
6  *               Thomas Friebel <tf13@os.inf.tu-dresden.de>
7  *     economic rights: Technische Universitaet Dresden (Germany)
8  *
9  * This file is part of TUD:OS and distributed under the terms of the
10  * GNU General Public License 2.
11  * Please see the COPYING-GPL-2 file for details.
12  */
13
14 /**
15  * Unchecked (no BSD invariants) condition variable implementation for
16  * dde-internal use. Written from scratch.
17  */
18 #include <l4/dde/ddekit/condvar.h>
19 #include <l4/dde/ddekit/lock.h>
20 #include <l4/dde/ddekit/memory.h>
21 #include <l4/dde/ddekit/panic.h>
22 #include <l4/dde/ddekit/assert.h>
23 #include "internals.h"
24
25 struct ddekit_condvar {
26         pthread_cond_t cond;
27 };
28
29 ddekit_condvar_t *ddekit_condvar_init()
30 {
31         ddekit_condvar_t *c = ddekit_simple_malloc(sizeof(ddekit_condvar_t));
32         int r = pthread_cond_init(&c->cond, NULL);
33         Assert(r == 0);
34         return c;
35 }
36
37
38 void ddekit_condvar_wait(ddekit_condvar_t *cvp, ddekit_lock_t *mp)
39 {
40         int r = pthread_cond_wait(&cvp->cond, ddekit_lock_to_pthread(*mp));
41         Assert(r == 0);
42 }
43
44
45 int ddekit_condvar_wait_timed(ddekit_condvar_t *cvp, ddekit_lock_t *mp, int timo)
46 {
47         struct timespec abs_to = ddekit_abs_to_from_rel_ms(timo);
48         return pthread_cond_timedwait(&cvp->cond,
49                                       ddekit_lock_to_pthread(*mp),
50                                       &abs_to);
51 }
52
53
54 void ddekit_condvar_signal(ddekit_condvar_t *cvp)
55 {
56         int r = pthread_cond_signal(&cvp->cond);
57         Assert(r == 0);
58 }
59
60
61 void ddekit_condvar_broadcast(ddekit_condvar_t *cvp)
62 {
63         int r = pthread_cond_broadcast(&cvp->cond);
64         Assert(r == 0);
65 }