1 #include <minix/mthread.h>
2 #include "global.h"
3
4 /*===========================================================================*
5 * mthread_event_init *
6 *===========================================================================*/
mthread_event_init(event)7 int mthread_event_init(event)
8 mthread_event_t *event; /* The event to be initialized */
9 {
10 /* Initialize an event object.
11 */
12 int r;
13
14 if (!event)
15 return EINVAL;
16
17 r = mthread_mutex_init(&event->mutex, NULL);
18 if (r != 0)
19 return r;
20
21 r = mthread_cond_init(&event->cond, NULL);
22 if (r != 0)
23 mthread_mutex_destroy(&event->mutex);
24
25 return r;
26 }
27
28
29 /*===========================================================================*
30 * mthread_event_destroy *
31 *===========================================================================*/
mthread_event_destroy(event)32 int mthread_event_destroy(event)
33 mthread_event_t *event; /* The event to be destroyed */
34 {
35 /* Destroy an event object.
36 */
37 int r;
38
39 if (!event)
40 return EINVAL;
41
42 r = mthread_cond_destroy(&event->cond);
43 if (r != 0)
44 return r;
45
46 return mthread_mutex_destroy(&event->mutex);
47 }
48
49 /*===========================================================================*
50 * mthread_event_wait *
51 *===========================================================================*/
mthread_event_wait(event)52 int mthread_event_wait(event)
53 mthread_event_t *event; /* The event to be waited on */
54 {
55 /* Wait for an event, blocking the current thread in the process.
56 */
57 int r;
58
59 if (!event)
60 return EINVAL;
61
62 r = mthread_mutex_lock(&event->mutex);
63 if (r != 0)
64 return r;
65
66 r = mthread_cond_wait(&event->cond, &event->mutex);
67 if (r != 0) {
68 mthread_mutex_unlock(&event->mutex);
69 return r;
70 }
71
72 return mthread_mutex_unlock(&event->mutex);
73 }
74
75 /*===========================================================================*
76 * mthread_event_fire *
77 *===========================================================================*/
mthread_event_fire(event)78 int mthread_event_fire(event)
79 mthread_event_t *event; /* The event to be fired */
80 {
81 /* Fire an event, waking up any thread blocked on it.
82 */
83 int r;
84
85 if (!event)
86 return EINVAL;
87
88 r = mthread_mutex_lock(&event->mutex);
89 if (r != 0)
90 return r;
91
92 r = mthread_cond_signal(&event->cond);
93 if (r != 0) {
94 mthread_mutex_unlock(&event->mutex);
95 return r;
96 }
97
98 return mthread_mutex_unlock(&event->mutex);
99 }
100
101
102 /*===========================================================================*
103 * mthread_event_fire_all *
104 *===========================================================================*/
mthread_event_fire_all(event)105 int mthread_event_fire_all(event)
106 mthread_event_t *event; /* The event to be fired */
107 {
108 /* Fire an event, waking up any thread blocked on it.
109 */
110 int r;
111
112 if (!event)
113 return EINVAL;
114
115 r = mthread_mutex_lock(&event->mutex);
116 if (r != 0)
117 return r;
118
119 r = mthread_cond_broadcast(&event->cond);
120 if (r != 0) {
121 mthread_mutex_unlock(&event->mutex);
122 return r;
123 }
124
125 return mthread_mutex_unlock(&event->mutex);
126 }
127
128 /* pthread compatibility layer. */
129 __weak_alias(pthread_event_destroy, mthread_event_destroy)
130 __weak_alias(pthread_event_init, mthread_event_init)
131 __weak_alias(pthread_event_wait, mthread_event_wait)
132 __weak_alias(pthread_event_fire, mthread_event_fire)
133 __weak_alias(pthread_event_fire_all, mthread_event_fire_all)
134
135