# HG changeset patch # User Tatsuki IHA # Date 1434437988 -32400 # Node ID 4283b87ddbf4c86568f62520b5ee04ed9a3074c1 # Parent 2ff693c5563ca8550f9da7e51ee9a842f9831dc6 Add stub to synchronizedQueues diff -r 2ff693c5563c -r 4283b87ddbf4 src/list/list.c --- a/src/list/list.c Tue Jun 16 01:18:39 2015 +0900 +++ b/src/list/list.c Tue Jun 16 15:59:48 2015 +0900 @@ -8,7 +8,7 @@ extern __code initListContext(struct Context* context); -__code code1(struct Context* context, struct Allocate *allocate) { +__code code1(struct Context* context, struct Allocate* allocate) { allocate->size = sizeof(struct Element); allocate->next = Code2; goto meta(context, Allocator); diff -r 2ff693c5563c -r 4283b87ddbf4 src/synchronizedQueue/synchronizedQueue.c --- a/src/synchronizedQueue/synchronizedQueue.c Tue Jun 16 01:18:39 2015 +0900 +++ b/src/synchronizedQueue/synchronizedQueue.c Tue Jun 16 15:59:48 2015 +0900 @@ -31,111 +31,152 @@ // goto meta(context, Sender); //} -__code code1(struct Context* context) { - context->data[Allocate]->allocate.size = sizeof(long); - context->data[Allocate]->allocate.next = Code2; +__code code1(struct Context* context, struct Allocate* allocate) { + allocate->size = sizeof(long); + allocate->next = Code2; goto meta(context, Allocator); } -__code code2(struct Context* context) { - context->data[Counter] -> count = 0; +__code code1_stub(struct Context* context) { + goto code1(context, &context->data[Allocate]->allocate); +} + +__code code2(struct Context* context, long* count) { + *count = 0; goto meta(context, Code3); } -__code code3(struct Context* context) { - long loop = context->data[Counter]->count; +__code code2_stub(struct Context* context) { + goto code2(context, &context->data[Counter]->count); +} + +__code code3(struct Context* context, long* count, struct Allocate* allocate) { + long loop = *count; if(loop == NUM) { goto meta(context, ThreadExit); } - context->data[Allocate]->allocate.size = sizeof(struct Element); - context->data[Allocate]->allocate.next = Code4; + allocate->size = sizeof(struct Element); + allocate->next = Code4; goto meta(context, Allocator); } -__code code4(struct Context* context) { - context->data[Allocate]->allocate.after_put = Code3; - context->data[context->dataNum] -> element.value = context->data[Counter]->count++; +__code code3_stub(struct Context* context) { + goto code3(context, &context->data[Counter]->count, &context->data[Allocate]->allocate); +} + +__code code4(struct Context* context, long* count, struct Allocate* allocate, struct Element* element) { + allocate->after_put = Code3; + element->value = (*count)++; goto meta(context, Sender); } -__code meta_sender(struct Context* context, enum Code next) { +__code code4_stub(struct Context* context) { + goto code4(context, &context->data[Counter]->count, &context->data[Allocate]->allocate, &context->data[context->dataNum]->element); +} + +__code meta_sender(struct Context* context, struct Queue* queue, enum Code next) { // lock - pthread_mutex_lock(&context->data[Queue]->queue.mutex); + pthread_mutex_lock(&queue->mutex); + goto (context->code[next])(context); +} + +__code sender(struct Context* context, struct Queue* queue) { + goto meta_sender(context, queue, Put); +} + +__code sender_stub(struct Context* context) { + goto sender(context, &context->data[Queue]->queue); +} + +__code meta_put(struct Context* context, struct Queue* queue, enum Code next) { + // signal + pthread_cond_signal(&queue->cond); + // unlock + pthread_mutex_unlock(&queue->mutex); goto (context->code[next])(context); } -__code sender(struct Context* context) { - goto meta_sender(context, Put); +__code put(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element) { + if(queue->first) { + queue->last->next = element; + } else { + queue->first = element; + } + queue->last = element; + element->next = 0; + queue->count++; + printf("Put %d\n\n", element->value); + goto meta_put(context, queue, allocate->after_put); +} + +__code put_stub(struct Context* context) { + goto put(context, &context->data[Allocate]->allocate, &context->data[Queue]->queue, &context->data[context->dataNum]->element); +} + +__code code5(struct Context* context, struct Allocate* allocate) { + allocate->size = sizeof(long); + allocate->next = Code6; + goto meta(context, Allocator); +} + +__code code5_stub(struct Context* context) { + goto code5(context, &context->data[Allocate]->allocate); +} + +__code code6(struct Context* context, long* count) { + *count = 0; + goto meta(context, Code7); } -__code meta_put(struct Context* context, enum Code next) { - if(context->data[Queue]->queue.first) { - context->data[Queue]->queue.last->element.next = context->data[context->dataNum]; - context->data[Queue]->queue.last = context->data[Queue]->queue.last->element.next; - } else { - context->data[Queue]->queue.first = context->data[context->dataNum]; - context->data[Queue]->queue.last = context->data[Queue]->queue.first; +__code code6_stub(struct Context* context) { + goto code6(context, &context->data[Counter]->count); +} + +__code code7(struct Context* context, long* count, struct Allocate* allocate) { + long loop = *count; + if(loop == NUM) { + goto meta(context, ThreadExit); } - context->data[Queue]->queue.last->element.next = 0; - context->data[Queue]->queue.count++; - printf("Put %d\n\n", context->data[Queue]->queue.last->element.value); + (*count)++; + allocate->after_get = Code7; + goto meta(context, Receiver); +} + +__code code7_stub(struct Context* context) { + goto code7(context, &context->data[Counter]->count, &context->data[Allocate]->allocate); +} - // signal - pthread_cond_signal(&context->data[Queue]->queue.cond); - // unlock +__code meta_receiver(struct Context* context, struct Queue* queue, enum Code next) { + // lock + pthread_mutex_lock(&queue->mutex); + goto (context->code[next])(context); +} + +__code receiver(struct Context* context, struct Queue* queue) { + goto meta_receiver(context, queue, Get); +} + +__code receiver_stub(struct Context* context) { + goto receiver(context, &context->data[Queue]->queue); +} +__code meta_get(struct Context* context, enum Code next) { pthread_mutex_unlock(&context->data[Queue]->queue.mutex); goto (context->code[next])(context); } -__code put(struct Context* context) { - goto meta_put(context, context->data[Allocate]->allocate.after_put); -} - -__code code5(struct Context* context) { - context->data[Allocate]->allocate.size = sizeof(long); - context->data[Allocate]->allocate.next = Code6; - goto meta(context, Allocator); -} - -__code code6(struct Context* context) { - context->data[Counter] -> count = 0; - goto meta(context, Code7); -} - -__code code7(struct Context* context) { - long loop = context->data[Counter]->count; - if(loop == NUM) { - goto meta(context, ThreadExit); +__code get(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element) { + // thread wait if queue is empty + while (queue->count == 0) { + pthread_cond_wait(&queue->cond, &queue->mutex); } - context->data[Counter]->count++; - context->data[Allocate]->allocate.after_get = Code7; - goto meta(context, Receiver); + printf(" Get %d\n\n", queue->first->value); + queue->first = (queue->first->next) ? queue->first->next : 0; + queue->count--; + goto meta_get(context, allocate->after_get); } -__code meta_receiver(struct Context* context, enum Code next) { - // lock - pthread_mutex_lock(&context->data[Queue]->queue.mutex); - goto (context->code[next])(context); -} - -__code receiver(struct Context* context) { - goto meta_receiver(context, Get); -} - -__code meta_get(struct Context* context, enum Code next) { - // thread wait if queue is empty - while (context->data[Queue]->queue.count == 0) { - pthread_cond_wait(&context->data[Queue]->queue.cond, &context->data[Queue]->queue.mutex); - } - printf(" Get %d\n\n", context->data[Queue]->queue.first->element.value); - context->data[Queue]->queue.first = (context->data[Queue]->queue.first->element.next) ? context->data[Queue]->queue.first->element.next : 0; - context->data[Queue]->queue.count--; - pthread_mutex_unlock(&context->data[Queue]->queue.mutex); - goto (context->code[next])(context); -} - -__code get(struct Context* context) { - goto meta_get(context, context->data[Allocate]->allocate.after_get); +__code get_stub(struct Context* context) { + goto get(context, &context->data[Allocate]->allocate, &context->data[Queue]->queue, &context->data[context->dataNum]->element); } __code thread_exit(struct Context* context) { @@ -145,6 +186,10 @@ pthread_exit(0); } +__code thread_exit_stub(struct Context* context) { + goto thread_exit(context); +} + void* thread_func(void* context) { goto start_code((struct Context*)context, Code1); return 0; diff -r 2ff693c5563c -r 4283b87ddbf4 src/synchronizedQueue/synchronizedQueueContext.c --- a/src/synchronizedQueue/synchronizedQueueContext.c Tue Jun 16 01:18:39 2015 +0900 +++ b/src/synchronizedQueue/synchronizedQueueContext.c Tue Jun 16 15:59:48 2015 +0900 @@ -2,21 +2,21 @@ #include "synchronizedQueueContext.h" -extern __code code1(struct Context*); -extern __code code2(struct Context*); -extern __code code3(struct Context*); -extern __code code4(struct Context*); -extern __code code5(struct Context*); -extern __code code6(struct Context*); -extern __code code7(struct Context*); +extern __code code1_stub(struct Context*); +extern __code code2_stub(struct Context*); +extern __code code3_stub(struct Context*); +extern __code code4_stub(struct Context*); +extern __code code5_stub(struct Context*); +extern __code code6_stub(struct Context*); +extern __code code7_stub(struct Context*); extern __code meta(struct Context*); extern __code allocate(struct Context*); -extern __code sender(struct Context*); -extern __code put(struct Context*); -extern __code receiver(struct Context*); -extern __code get(struct Context*); +extern __code sender_stub(struct Context*); +extern __code put_stub(struct Context*); +extern __code receiver_stub(struct Context*); +extern __code get_stub(struct Context*); extern __code exit_code(struct Context*); -extern __code thread_exit(struct Context*); +extern __code thread_exit_stub(struct Context*); __code initSynchronizedQueueContext(struct Context* context) { context->dataSize = sizeof(union Data)*ALLOCATE_SIZE; @@ -24,21 +24,21 @@ context->data = malloc(sizeof(union Data*)*ALLOCATE_SIZE); context->heap_start = malloc(context->dataSize); - context->codeNum = Exit; - context->code[Code1] = code1; - context->code[Code2] = code2; - context->code[Code3] = code3; - context->code[Code4] = code4; - context->code[Code5] = code5; - context->code[Code6] = code6; - context->code[Code7] = code7; - context->code[Allocator] = allocate; - context->code[Sender] = sender; - context->code[Put] = put; - context->code[Receiver] = receiver; - context->code[Get] = get; - context->code[Exit] = exit_code; - context->code[ThreadExit] = thread_exit; + context->codeNum = Exit; + context->code[Allocator] = allocate; + context->code[Code1] = code1_stub; + context->code[Code2] = code2_stub; + context->code[Code3] = code3_stub; + context->code[Code4] = code4_stub; + context->code[Code5] = code5_stub; + context->code[Code6] = code6_stub; + context->code[Code7] = code7_stub; + context->code[Sender] = sender_stub; + context->code[Put] = put_stub; + context->code[Receiver] = receiver_stub; + context->code[Get] = get_stub; + context->code[Exit] = exit_code; + context->code[ThreadExit] = thread_exit_stub; context->heap = context->heap_start; diff -r 2ff693c5563c -r 4283b87ddbf4 src/synchronizedQueue/synchronizedQueueContext.h --- a/src/synchronizedQueue/synchronizedQueueContext.h Tue Jun 16 01:18:39 2015 +0900 +++ b/src/synchronizedQueue/synchronizedQueueContext.h Tue Jun 16 15:59:48 2015 +0900 @@ -40,15 +40,15 @@ union Data { long count; struct Queue { - union Data* first; - union Data* last; + struct Element* first; + struct Element* last; int count; pthread_mutex_t mutex; pthread_cond_t cond; } queue; struct Element { int value; - union Data* next; + struct Element* next; } element; struct Allocate { long size; diff -r 2ff693c5563c -r 4283b87ddbf4 src/synchronizedQueue/synchronizedQueueForCas.c --- a/src/synchronizedQueue/synchronizedQueueForCas.c Tue Jun 16 01:18:39 2015 +0900 +++ b/src/synchronizedQueue/synchronizedQueueForCas.c Tue Jun 16 15:59:48 2015 +0900 @@ -31,49 +31,70 @@ // goto meta(context, Sender); //} -__code code1(struct Context* context) { - context->data[Allocate]->allocate.size = sizeof(long); - context->data[Allocate]->allocate.next = Code2; +__code code1(struct Context* context, struct Allocate* allocate) { + allocate->size = sizeof(long); + allocate->next = Code2; goto meta(context, Allocator); } -__code code2(struct Context* context) { - context->data[Counter] -> count = 0; +__code code1_stub(struct Context* context) { + goto code1(context, &context->data[Allocate]->allocate); +} + +__code code2(struct Context* context, long* count) { + *count = 0; goto meta(context, Code3); } -__code code3(struct Context* context) { - long loop = context->data[Counter]->count; +__code code2_stub(struct Context* context) { + goto code2(context, &context->data[Counter]->count); +} + + +__code code3(struct Context* context, long* count, struct Allocate* allocate) { + long loop = *count; if(loop == NUM) { goto meta(context, ThreadExit); } - context->data[Allocate]->allocate.size = sizeof(struct Element); - context->data[Allocate]->allocate.next = Code4; + allocate->size = sizeof(struct Element); + allocate->next = Code4; goto meta(context, Allocator); } -__code code4(struct Context* context) { - context->data[Allocate]->allocate.after_put = Code3; - context->data[Allocate]->allocate.after_fail = Code3; - context->data[context->dataNum] -> element.value = context->data[Counter]->count++; +__code code3_stub(struct Context* context) { + goto code3(context, &context->data[Counter]->count, &context->data[Allocate]->allocate); +} + +__code code4(struct Context* context, long* count, struct Allocate* allocate, struct Element* element) { + allocate->after_put = Code3; + allocate->after_fail = Code3; + element->value = (*count)++; goto meta(context, Sender); } +__code code4_stub(struct Context* context) { + goto code4(context, &context->data[Counter]->count, &context->data[Allocate]->allocate, &context->data[context->dataNum]->element); +} + __code sender(struct Context* context) { goto meta(context, Put); } -__code meta_put(struct Context* context, enum Code next) { - union Data *last_ds, *new_ds; - last_ds = context->data[Queue]->queue.last; - new_ds = context->data[context->dataNum]; - new_ds->element.next = 0; +__code sender_stub(struct Context* context) { + goto sender(context); +} + +__code meta_put(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element, enum Code next) { + struct Element *last_ds, *new_ds; + last_ds = queue->last; + new_ds = element; + new_ds->next = 0; int count = 0; - while(!__sync_bool_compare_and_swap(&context->data[Queue]->queue.last, last_ds, new_ds)) { + while(!__sync_bool_compare_and_swap(&queue->last, last_ds, new_ds)) { if(count < 1000) { - last_ds = context->data[Queue]->queue.last; - new_ds = context->data[context->dataNum]; - new_ds->element.next = 0; + last_ds = queue->last; + new_ds = element; + new_ds->next = 0; count++; } else { // error handle @@ -81,55 +102,75 @@ } } - if(context->data[Queue]->queue.first) { - last_ds->element.next = new_ds; + if(queue->first) { + last_ds->next = new_ds; } else { - context->data[Queue]->queue.first = new_ds; + queue->first = new_ds; } - printf("Put %d\n\n", context->data[Queue]->queue.last->element.value); - context->data[Queue]->queue.count++; + printf("Put %d\n\n", queue->last->value); + queue->count++; goto (context->code[next])(context); } -__code put(struct Context* context) { - goto meta_put(context, context->data[Allocate]->allocate.after_put); +__code put(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element) { + goto meta_put(context, allocate, queue, element, allocate->after_put); } -__code code5(struct Context* context) { - context->data[Allocate]->allocate.size = sizeof(long); - context->data[Allocate]->allocate.next = Code6; +__code put_stub(struct Context* context) { + goto put(context, &context->data[Allocate]->allocate, &context->data[Queue]->queue, &context->data[context->dataNum]->element); +} + +__code code5(struct Context* context, struct Allocate* allocate) { + allocate->size = sizeof(long); + allocate->next = Code6; goto meta(context, Allocator); } -__code code6(struct Context* context) { - context->data[Counter] -> count = 0; +__code code5_stub(struct Context* context) { + goto code5(context, &context->data[Allocate]->allocate); +} + +__code code6(struct Context* context, long* count) { + *count = 0; goto meta(context, Code7); } -__code code7(struct Context* context) { - long loop = context->data[Counter]->count; +__code code6_stub(struct Context* context) { + goto code6(context, &context->data[Counter]->count); +} + +__code code7(struct Context* context, long* count, struct Allocate* allocate) { + long loop = *count; if(loop == NUM) { goto meta(context, ThreadExit); } - context->data[Counter]->count++; - context->data[Allocate]->allocate.after_get = Code7; - context->data[Allocate]->allocate.after_fail = Code7; + (*count)++; + allocate->after_get = Code7; + allocate->after_fail = Code7; goto meta(context, Receiver); } +__code code7_stub(struct Context* context) { + goto code7(context, &context->data[Counter]->count, &context->data[Allocate]->allocate); +} + __code receiver(struct Context* context) { goto meta(context, Get); } -__code meta_get(struct Context* context, enum Code next) { - union Data *first_ds, *new_ds; - first_ds = context->data[Queue]->queue.first; - new_ds = first_ds? first_ds->element.next : 0; +__code receiver_stub(struct Context* context) { + goto receiver(context); +} + +__code meta_get(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element, enum Code next) { + struct Element *first_ds, *new_ds; + first_ds = queue->first; + new_ds = first_ds? first_ds->next : 0; int count = 0; - while(!__sync_bool_compare_and_swap(&context->data[Queue]->queue.first, first_ds, new_ds)) { + while(!__sync_bool_compare_and_swap(&queue->first, first_ds, new_ds)) { if(count < 1000) { - first_ds = context->data[Queue]->queue.first; - new_ds = first_ds? first_ds->element.next : 0; + first_ds = queue->first; + new_ds = first_ds? first_ds->next : 0; count++; } else { // error handle @@ -142,14 +183,18 @@ printf("queue is empty\n"); goto meta(context, Get); } else { - printf(" Get %d\n\n", first_ds->element.value); - context->data[Queue]->queue.count--; + printf(" Get %d\n\n", first_ds->value); + queue->count--; goto (context->code[next])(context); } } -__code get(struct Context* context) { - goto meta_get(context, context->data[Allocate]->allocate.after_get); +__code get(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element) { + goto meta_get(context, allocate, queue, element, allocate->after_get); +} + +__code get_stub(struct Context* context) { + goto get(context, &context->data[Allocate]->allocate, &context->data[Queue]->queue, &context->data[context->dataNum]->element); } __code thread_exit(struct Context* context) { @@ -159,6 +204,10 @@ pthread_exit(0); } +__code thread_exit_stub(struct Context* context) { + goto thread_exit(context); +} + void* thread_func(void* context) { goto start_code((struct Context*)context, Code1); return 0;