annotate parallel_processing/ppb_cond_queue/ppb_queue.h @ 20:28cac8b199cb

add ppb_queue.h
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 07 Jan 2014 00:37:27 +0900
parents
children d137f1823794
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #ifdef _PPB_QUEUE_H
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #define _PPB_QUEUE_H
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include <unistd.h>
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include <pthread.h>
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #ifdef MAX_QUEUE_NUM
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #define MAX_QUEUE_NUM 10
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #endif /* MAX_QUEUE_NUM */
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 typedef struct _queue {
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 int values[MAX_QUEUE_NUM];
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 volatile int remain;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 int rp, wp;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 pthread_mutex_t mutex;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 pthread_cond_t not_full;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 pthread_cond_t not_empty;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 } queue_t;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 void enqueue(queue_t *q, int v) {
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 pthread_mutex_lock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 while (q->remain == MAX_QUEUE_NUM)
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 pthread_cond_wait(&q->not_fill, &q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 q->values[q->wp] = v;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 q->wp++; q->remain++;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 if (q->wp == MAX_QUEUE_NUM) q->wp = 0;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 pthread_cond_signal(&q->not_empty);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 pthread_mutex_unlock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 }
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 void dequeue(queue_t *q, int v) {
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 pthread_mutex_lock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 while (q->remain == 0)
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 pthread_cond_wait(&q->not_empty, &q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 v = q->values[q->rp];
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 q->rp++; q->remain--;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 if (q->rp == MAX_QUEUE_NUM) q->rp = 0;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 pthread_cond_signal(&q->not_full);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 pthread_mutex_unlock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 #endif /* _PPB_QUEUE_H */