changeset 9:a8c53472e1a3

add file
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 09 Feb 2016 17:24:07 +0900
parents 470e783fdebe
children e4df300f45b6
files master_paper.sty src/dequeue.c src/enqueue.c src/queue.h src/sync_dequeue.c src/sync_enqueue.c
diffstat 6 files changed, 209 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/master_paper.sty	Tue Feb 09 17:17:33 2016 +0900
+++ b/master_paper.sty	Tue Feb 09 17:24:07 2016 +0900
@@ -106,7 +106,7 @@
 \def\ethesis{Master's Thesis of Engineering}
 
 \def\university{琉球大学}
-\def\euniversity{Universty of the Ryukyus}
+\def\euniversity{University of the Ryukyus}
 
 \def\department{大学院理工学研究科}
 \def\edepartment{Graduate School of Engineering and Science}
@@ -141,33 +141,25 @@
 \begin{center}%
   \let\footnote\thanks
   {\Large\bfseries\thesis \par}
-    \vskip 0.3 em
   {\Large\textbf\ethesis \par}
     \vskip 2.0 em
   {\LARGE\bfseries\mc\@title \par}
-    \vskip 0.3 em
   {\LARGE\textbf{\@etitle} \par}
     \vskip 2.0 em
   {\large \@year \par}
-    \vskip 0.3 em
   {\large\textbf\@eyear \par}
     \vskip 1.0 em
   {\large \@author \par}
-    \vskip 0.3 em
   {\large\textbf\@eauthor \par}
     \vskip 2.0 em
   {\large \@affiliation \par}
     \vskip 2.0 em
   {\large\bfseries\university \par}
-    \vskip 0.3 em
   {\large\bfseries\department \par}
-    \vskip 0.3 em
   {\large\bfseries\course \par}
     \vskip 1.0 em
   {\large\textbf\ecourse \par}
-    \vskip 0.3 em
   {\large\textbf\edepartment \par}
-    \vskip 0.3 em
   {\large\textbf\euniversity \par}
 \end{center}}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dequeue.c	Tue Feb 09 17:24:07 2016 +0900
@@ -0,0 +1,24 @@
+// Dequeue
+__code getQueue(struct Context* context, struct Queue* queue, struct Node* node) {
+    if (queue->first == 0)
+        return;
+
+    struct Element* first = queue->first;
+    queue->first = first->next;
+    queue->count--;
+    
+    context->next = GetQueue;
+    stack_push(context->code_stack, &context->next);
+
+    context->next = first->task->code;
+    node->key = first->task->key;
+
+    goto meta(context, GetTree);
+}
+
+// Meta Code Gear(stub)
+__code getQueue_stub(struct Context* context) {
+    goto getQueue(context,
+                  &context->data[ActiveQueue]->queue,
+                  &context->data[Node]->node);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/enqueue.c	Tue Feb 09 17:24:07 2016 +0900
@@ -0,0 +1,64 @@
+// allocate Element
+__code putQueue1(struct Context* context, struct Allocate* allocate) {
+    allocate->size = sizeof(struct Element);
+    allocator(context);
+
+    goto meta(context, PutQueue2);
+}
+
+// Meta Code Gear(stub)
+__code putQueue1_stub(struct Context* context) {
+    goto putQueue1(context, &context->data[Allocate]->allocate);
+}
+
+// write Element infomation
+__code putQueue2(struct Context* context, struct Element* new_element, struct Element* element, struct Queue* queue) {
+    new_element->task = element->task;
+
+    if (queue->first)
+        goto meta(context, PutQueue3);
+    else
+        goto meta(context, PutQueue4);
+}
+
+// Meta Code Gear(stub)
+__code putQueue2_stub(struct Context* context) {
+    goto putQueue2(context,
+                   &context->data[context->dataNum]->element,
+                   &context->data[Element]->element,
+                   &context->data[ActiveQueue]->queue);
+}
+
+// Enqueue(normal)
+__code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) {
+    struct Element* last = queue->last;
+    last->next = new_element;
+
+    queue->last = new_element;
+    queue->count++;
+        
+    goto meta(context, context->next);
+}
+
+// Meta Code Gear(stub)
+__code putQueue3_stub(struct Context* context) {
+    goto putQueue3(context,
+                   &context->data[ActiveQueue]->queue,
+                   &context->data[context->dataNum]->element);
+}
+
+// Enqueue(nothing element)
+__code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) {
+    queue->first = new_element;
+    queue->last = new_element;
+    queue->count++;
+        
+    goto meta(context, context->next);
+}
+
+// Meta Code Gear(stub)
+__code putQueue4_stub(struct Context* context) {
+    goto putQueue4(context,
+                   &context->data[ActiveQueue]->queue,
+                   &context->data[context->dataNum]->element);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/queue.h	Tue Feb 09 17:24:07 2016 +0900
@@ -0,0 +1,26 @@
+// Code Gear Name
+enum Code {
+    PutQueue,
+    GetQueue,
+};
+
+// Unique Data Gear
+enum UniqueData {
+    Queue,
+    Element,
+};
+
+// Queue definication
+union Data {
+    // size: 20 byte
+    struct Queue {
+        struct Element* first;
+        struct Element* last;
+        int count;
+    } queue;
+    // size: 16 byte
+    struct Element {
+        struct Task* task;
+        struct Element* next;
+    } element;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sync_dequeue.c	Tue Feb 09 17:24:07 2016 +0900
@@ -0,0 +1,28 @@
+// Dequeue
+__code getQueue(struct Context* context, struct Queue* queue, struct Node* node) {
+    if (queue->first == 0)
+        return;
+
+    struct Element* first = queue->first;
+    if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) {
+        //    if (OSAtomicCompareAndSwapPtr(first, first->next, (void*)&queue->first)) {
+        queue->count--;
+
+        context->next = GetQueue;
+        stack_push(context->code_stack, &context->next);
+
+        context->next = first->task->code;
+        node->key = first->task->key;
+
+        goto meta(context, Get);
+    } else {
+        goto meta(context, GetQueue);
+    }
+}
+
+// Meta Code Gear(stub)
+__code getQueue_stub(struct Context* context) {
+    goto getQueue(context,
+                  &context->data[ActiveQueue]->queue,
+                  &context->data[Node]->node);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sync_enqueue.c	Tue Feb 09 17:24:07 2016 +0900
@@ -0,0 +1,66 @@
+// allocate Element
+__code putQueue1(struct Context* context, struct Allocate* allocate) {
+    allocate->size = sizeof(struct Element);
+    allocator(context);
+
+    goto meta(context, PutQueue2);
+}
+
+// Meta Code Gear(stub)
+__code putQueue1_stub(struct Context* context) {
+    goto putQueue1(context, &context->data[Allocate]->allocate);
+}
+
+// write Element infomation
+__code putQueue2(struct Context* context, struct Element* new_element, struct Element* element, struct Queue* queue) {
+    new_element->task = element->task;
+
+    if (queue->first)
+        goto meta(context, PutQueue3);
+    else
+        goto meta(context, PutQueue4);
+}
+
+// Meta Code Gear(stub)
+__code putQueue2_stub(struct Context* context) {
+    goto putQueue2(context,
+                   &context->data[context->dataNum]->element,
+                   &context->data[Element]->element,
+                   &context->data[ActiveQueue]->queue);
+}
+
+// Enqueue(normal)
+__code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) {
+    struct Element* last = queue->last;
+
+    if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) {
+        last->next = new_element;
+        queue->count++;
+        
+        goto meta(context, context->next);
+    } else {
+        goto meta(context, PutQueue3);
+    }
+}
+
+// Meta Code Gear(stub)
+__code putQueue3_stub(struct Context* context) {
+    goto putQueue3(context, &context->data[ActiveQueue]->queue, &context->data[context->dataNum]->element);
+}
+
+// Enqueue(nothing element)
+__code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) {
+    if (__sync_bool_compare_and_swap(&queue->first, 0, new_element)) {
+        queue->last = new_element;
+        queue->count++;
+        
+        goto meta(context, context->next);
+    } else {
+        goto meta(context, PutQueue3);
+    }
+}
+
+// Meta Code Gear(stub)
+__code putQueue4_stub(struct Context* context) {
+    goto putQueue4(context, &context->data[ActiveQueue]->queue, &context->data[context->dataNum]->element);
+}