# HG changeset patch # User Masataka Kohagura # Date 1389022647 -32400 # Node ID 28cac8b199cbb047b960202c15fa2116dd978e4d # Parent a9534f217a0c3219324b13ac86312d53bc738ad6 add ppb_queue.h diff -r a9534f217a0c -r 28cac8b199cb parallel_processing/ppb_cond_queue/ppb_queue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parallel_processing/ppb_cond_queue/ppb_queue.h Tue Jan 07 00:37:27 2014 +0900 @@ -0,0 +1,41 @@ +#ifdef _PPB_QUEUE_H +#define _PPB_QUEUE_H +#include +#include + +#ifdef MAX_QUEUE_NUM +#define MAX_QUEUE_NUM 10 +#endif /* MAX_QUEUE_NUM */ + +typedef struct _queue { + int values[MAX_QUEUE_NUM]; + volatile int remain; + int rp, wp; + pthread_mutex_t mutex; + pthread_cond_t not_full; + pthread_cond_t not_empty; +} queue_t; + +void enqueue(queue_t *q, int v) { + pthread_mutex_lock(&q->mutex); + while (q->remain == MAX_QUEUE_NUM) + pthread_cond_wait(&q->not_fill, &q->mutex); + q->values[q->wp] = v; + q->wp++; q->remain++; + if (q->wp == MAX_QUEUE_NUM) q->wp = 0; + pthread_cond_signal(&q->not_empty); + pthread_mutex_unlock(&q->mutex); +} + +void dequeue(queue_t *q, int v) { + pthread_mutex_lock(&q->mutex); + while (q->remain == 0) + pthread_cond_wait(&q->not_empty, &q->mutex); + v = q->values[q->rp]; + q->rp++; q->remain--; + if (q->rp == MAX_QUEUE_NUM) q->rp = 0; + pthread_cond_signal(&q->not_full); + pthread_mutex_unlock(&q->mutex); +} + +#endif /* _PPB_QUEUE_H */