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 }