All pastes #1890494 Raw Edit

Miscellany

public c v1 · immutable
#1890494 ·published 2010-06-27 16:15 UTC
rendered paste body
#include "event.h"#include <assert.h>#include <stdlib.h>#include <pthread.h>typedef enum SIGNAL_{  UNSIGNALED  = 0,  SIGNALED} SIGNAL;struct event_{  pthread_mutex_t lock;  pthread_cond_t  cond;  SIGNAL          signaled;};event event_create(){  event e;  if ((e = malloc(sizeof(struct event_))))  {    e->signaled = UNSIGNALED;    if (0 == pthread_mutex_init(&e->lock, NULL))    {      if (0 == pthread_cond_init(&e->cond, NULL))        return e;      pthread_mutex_destroy(&e->lock);    }    free(e);  }  return NULL;}void event_destroy(event e){  assert(e);  event_signal(e);  pthread_mutex_lock(&e->lock);  pthread_cond_destroy(&e->cond);  pthread_mutex_unlock(&e->lock);  pthread_mutex_destroy(&e->lock);  free(e);}int event_wait(event e){  assert(e);  pthread_mutex_lock(&e->lock);  if (e->signaled == UNSIGNALED)    pthread_cond_wait(&e->cond, &e->lock);  pthread_mutex_unlock(&e->lock);  sched_yield();  return 0;}void event_clear(event e){  assert(e);  pthread_mutex_lock(&e->lock);  e->signaled = UNSIGNALED;  pthread_mutex_unlock(&e->lock);}void event_signal(event e){  assert(e);  pthread_mutex_lock(&e->lock);  e->signaled = SIGNALED;  pthread_mutex_unlock(&e->lock);  pthread_cond_broadcast(&e->cond);}void event_pulse(event e){  assert(e);  pthread_mutex_lock(&e->lock);  if (e->signaled == UNSIGNALED)  {    e->signaled = SIGNALED;    pthread_cond_signal(&e->cond);    pthread_mutex_unlock(&e->lock);    sched_yield();    pthread_mutex_lock(&e->lock);    e->signaled = UNSIGNALED;  }  pthread_mutex_unlock(&e->lock);}void event_pulse_all(event e){  assert(e);  pthread_mutex_lock(&e->lock);  if (e->signaled == UNSIGNALED)  {    e->signaled = SIGNALED;    pthread_cond_broadcast(&e->cond);    pthread_mutex_unlock(&e->lock);    sched_yield();    pthread_mutex_lock(&e->lock);    e->signaled = UNSIGNALED;  }  pthread_mutex_unlock(&e->lock);}