changeset 56:4283b87ddbf4

Add stub to synchronizedQueues
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 16 Jun 2015 15:59:48 +0900
parents 2ff693c5563c
children e8bf3ee224e7
files src/list/list.c src/synchronizedQueue/synchronizedQueue.c src/synchronizedQueue/synchronizedQueueContext.c src/synchronizedQueue/synchronizedQueueContext.h src/synchronizedQueue/synchronizedQueueForCas.c
diffstat 5 files changed, 250 insertions(+), 156 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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;
--- 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;
 
--- 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;
--- 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;