bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

sync.c (1029B)


      1 #include "log.h"
      2 #include "sync.h"
      3 
      4 channel_t channel_new(size_t msg_sz) {
      5     channel_t out;
      6     out.msg_sz = msg_sz;
      7     pthread_mutex_init(&out.mutex, NULL);
      8     out.queue = vec_new(msg_sz);
      9     out.sz = 0;
     10     return out;
     11 }
     12 
     13 void channel_push(channel_t* chan, void* msg) {
     14     pthread_mutex_lock(&chan->mutex);
     15     vec_push(&chan->queue, msg);
     16     pthread_mutex_unlock(&chan->mutex);
     17     __atomic_fetch_add(&chan->sz, 1, __ATOMIC_RELAXED);
     18 }
     19 
     20 void* channel_pop(channel_t* chan) {
     21     void* out;
     22     pthread_mutex_lock(&chan->mutex);
     23     out = vec_get(&chan->queue, chan->queue.vec_sz-1);
     24     chan->queue.vec_sz -= 1;
     25     pthread_mutex_unlock(&chan->mutex);
     26     __atomic_fetch_sub(&chan->sz, 1, __ATOMIC_RELAXED);
     27     return out;
     28 }
     29 
     30 void* channel_recv(channel_t* chan) {
     31     while(__atomic_load_n(&chan->sz, __ATOMIC_RELAXED) == 0);
     32     return channel_pop(chan);
     33 }
     34 
     35 void* channel_try_recv(channel_t* chan) {
     36     if (__atomic_load_n(&chan->sz, __ATOMIC_RELAXED) > 0) {
     37         return channel_pop(chan);
     38     }
     39     return 0x0;
     40 }