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