xref: /minix/minix/lib/libmthread/event.c (revision 7f5f010b)
1 #include <minix/mthread.h>
2 #include "global.h"
3 
4 /*===========================================================================*
5  *				mthread_event_init			     *
6  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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