annotate parallel_processing/ppb_cond_queue/ppb_queue.h @ 21:d137f1823794

fix (but cannot running)
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 07 Jan 2014 14:15:51 +0900
parents 28cac8b199cb
children
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
21
d137f1823794 fix (but cannot running)
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
10 /*
20
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 typedef struct _queue {
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 int values[MAX_QUEUE_NUM];
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 volatile int remain;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 int rp, wp;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 pthread_mutex_t mutex;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 pthread_cond_t not_full;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 pthread_cond_t not_empty;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 } queue_t;
21
d137f1823794 fix (but cannot running)
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
19 */
20
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 void enqueue(queue_t *q, int v) {
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 pthread_mutex_lock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 while (q->remain == MAX_QUEUE_NUM)
21
d137f1823794 fix (but cannot running)
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
24 pthread_cond_wait(&q->not_full, &q->mutex);
20
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 q->values[q->wp] = v;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 q->wp++; q->remain++;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 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
28 pthread_cond_signal(&q->not_empty);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 pthread_mutex_unlock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 }
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 void dequeue(queue_t *q, int v) {
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 pthread_mutex_lock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 while (q->remain == 0)
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 pthread_cond_wait(&q->not_empty, &q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 v = q->values[q->rp];
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 q->rp++; q->remain--;
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 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
39 pthread_cond_signal(&q->not_full);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 pthread_mutex_unlock(&q->mutex);
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 }
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
28cac8b199cb add ppb_queue.h
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 #endif /* _PPB_QUEUE_H */