127 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <minix/mthread.h>
 | |
| #include "global.h"
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				mthread_event_init			     *
 | |
|  *===========================================================================*/
 | |
| int mthread_event_init(event)
 | |
| mthread_event_t *event; /* The event to be initialized */
 | |
| {
 | |
| /* Initialize an event object.
 | |
|  */
 | |
|   int r;
 | |
| 
 | |
|   if (!event)
 | |
| 	return EINVAL;
 | |
| 
 | |
|   r = mthread_mutex_init(&event->mutex, NULL);
 | |
|   if (r != 0)
 | |
| 	return r;
 | |
| 
 | |
|   r = mthread_cond_init(&event->cond, NULL);
 | |
|   if (r != 0) 
 | |
| 	mthread_mutex_destroy(&event->mutex);
 | |
| 
 | |
|   return r;
 | |
| }
 | |
| 
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				mthread_event_destroy			     *
 | |
|  *===========================================================================*/
 | |
| int mthread_event_destroy(event)
 | |
| mthread_event_t *event; /* The event to be destroyed */
 | |
| {
 | |
| /* Destroy an event object.
 | |
|  */
 | |
|   int r;
 | |
| 
 | |
|   if (!event)
 | |
| 	return EINVAL;
 | |
| 
 | |
|   r = mthread_cond_destroy(&event->cond);
 | |
|   if (r != 0)
 | |
| 	return r;
 | |
| 
 | |
|   return mthread_mutex_destroy(&event->mutex);
 | |
| }
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				mthread_event_wait			     *
 | |
|  *===========================================================================*/
 | |
| int mthread_event_wait(event)
 | |
| mthread_event_t *event; /* The event to be waited on */
 | |
| {
 | |
| /* Wait for an event, blocking the current thread in the process.
 | |
|  */
 | |
|   int r;
 | |
| 
 | |
|   if (!event)
 | |
| 	return EINVAL;
 | |
| 
 | |
|   r = mthread_mutex_lock(&event->mutex);
 | |
|   if (r != 0)
 | |
| 	return r;
 | |
| 
 | |
|   r = mthread_cond_wait(&event->cond, &event->mutex);
 | |
|   if (r != 0) {
 | |
| 	mthread_mutex_unlock(&event->mutex);
 | |
| 	return r;
 | |
|   }
 | |
| 
 | |
|   return mthread_mutex_unlock(&event->mutex);
 | |
| }
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				mthread_event_fire			     *
 | |
|  *===========================================================================*/
 | |
| int mthread_event_fire(event)
 | |
| mthread_event_t *event; /* The event to be fired */
 | |
| {
 | |
| /* Fire an event, waking up any thread blocked on it.
 | |
| */
 | |
|   int r;
 | |
| 
 | |
|   if (!event)
 | |
| 	return EINVAL;
 | |
| 
 | |
|   r = mthread_mutex_lock(&event->mutex);
 | |
|   if (r != 0)
 | |
| 	return r;
 | |
| 
 | |
|   r = mthread_cond_signal(&event->cond);
 | |
|   if (r != 0) {
 | |
| 	mthread_mutex_unlock(&event->mutex);
 | |
| 	return r;
 | |
|   }
 | |
| 
 | |
|   return mthread_mutex_unlock(&event->mutex);
 | |
| }
 | |
| 
 | |
| 
 | |
| /*===========================================================================*
 | |
|  *				mthread_event_fire_all			     *
 | |
|  *===========================================================================*/
 | |
| int mthread_event_fire_all(event)
 | |
| mthread_event_t *event; /* The event to be fired */
 | |
| {
 | |
| /* Fire an event, waking up any thread blocked on it.
 | |
| */
 | |
|   int r;
 | |
| 
 | |
|   if (!event)
 | |
| 	return EINVAL;
 | |
| 
 | |
|   r = mthread_mutex_lock(&event->mutex);
 | |
|   if (r != 0)
 | |
| 	return r;
 | |
| 
 | |
|   r = mthread_cond_broadcast(&event->cond);
 | |
|   if (r != 0) {
 | |
| 	mthread_mutex_unlock(&event->mutex);
 | |
| 	return r;
 | |
|   }
 | |
| 
 | |
|   return mthread_mutex_unlock(&event->mutex);
 | |
| }
 | 
