view parallel_processing/chapter3/ppb_cond_queue/ppb_queue.h @ 22:508b47c8f4d8

package Chapter3
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 07 Jan 2014 14:30:28 +0900
parents parallel_processing/ppb_cond_queue/ppb_queue.h@d137f1823794
children
line wrap: on
line source

#ifdef _PPB_QUEUE_H
#define _PPB_QUEUE_H
#include <unistd.h>
#include <pthread.h>

#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_full, &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 */