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 }