Mercurial > hg > GearsTemplate
comparison src/synchronizedQueue/synchronizedQueue.c @ 52:83ee9c75115a
Add pthread_cond_wait & pthread_cond_signal to synchronizedQueue.c
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 02 Jun 2015 14:17:07 +0900 |
parents | 1b71266af056 |
children | 4283b87ddbf4 |
comparison
equal
deleted
inserted
replaced
51:4302e2fb7019 | 52:83ee9c75115a |
---|---|
78 } | 78 } |
79 context->data[Queue]->queue.last->element.next = 0; | 79 context->data[Queue]->queue.last->element.next = 0; |
80 context->data[Queue]->queue.count++; | 80 context->data[Queue]->queue.count++; |
81 printf("Put %d\n\n", context->data[Queue]->queue.last->element.value); | 81 printf("Put %d\n\n", context->data[Queue]->queue.last->element.value); |
82 | 82 |
83 // signal | |
84 pthread_cond_signal(&context->data[Queue]->queue.cond); | |
83 // unlock | 85 // unlock |
84 pthread_mutex_unlock(&context->data[Queue]->queue.mutex); | 86 pthread_mutex_unlock(&context->data[Queue]->queue.mutex); |
85 goto (context->code[next])(context); | 87 goto (context->code[next])(context); |
86 } | 88 } |
87 | 89 |
119 __code receiver(struct Context* context) { | 121 __code receiver(struct Context* context) { |
120 goto meta_receiver(context, Get); | 122 goto meta_receiver(context, Get); |
121 } | 123 } |
122 | 124 |
123 __code meta_get(struct Context* context, enum Code next) { | 125 __code meta_get(struct Context* context, enum Code next) { |
124 if (context->data[Queue]->queue.count == 0) { | 126 // thread wait if queue is empty |
125 printf("queue is empty\n"); | 127 while (context->data[Queue]->queue.count == 0) { |
126 pthread_mutex_unlock(&context->data[Queue]->queue.mutex); | 128 pthread_cond_wait(&context->data[Queue]->queue.cond, &context->data[Queue]->queue.mutex); |
127 goto (context->code[next])(context); | |
128 } else { | |
129 printf(" Get %d\n\n", context->data[Queue]->queue.first->element.value); | |
130 context->data[Queue]->queue.first = (context->data[Queue]->queue.first->element.next) ? context->data[Queue]->queue.first->element.next : 0; | |
131 context->data[Queue]->queue.count--; | |
132 pthread_mutex_unlock(&context->data[Queue]->queue.mutex); | |
133 goto (context->code[next])(context); | |
134 } | 129 } |
130 printf(" Get %d\n\n", context->data[Queue]->queue.first->element.value); | |
131 context->data[Queue]->queue.first = (context->data[Queue]->queue.first->element.next) ? context->data[Queue]->queue.first->element.next : 0; | |
132 context->data[Queue]->queue.count--; | |
133 pthread_mutex_unlock(&context->data[Queue]->queue.mutex); | |
134 goto (context->code[next])(context); | |
135 } | 135 } |
136 | 136 |
137 __code get(struct Context* context) { | 137 __code get(struct Context* context) { |
138 goto meta_get(context, context->data[Allocate]->allocate.after_get); | 138 goto meta_get(context, context->data[Allocate]->allocate.after_get); |
139 } | 139 } |