# HG changeset patch # User Shohei KOKUBO # Date 1455006247 -32400 # Node ID a8c53472e1a342e5518ec8cf0f13d678676e93ed # Parent 470e783fdebe317740c4feb45ba2c74213e89e5e add file diff -r 470e783fdebe -r a8c53472e1a3 master_paper.sty --- 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}} diff -r 470e783fdebe -r a8c53472e1a3 src/dequeue.c --- /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); +} diff -r 470e783fdebe -r a8c53472e1a3 src/enqueue.c --- /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); +} diff -r 470e783fdebe -r a8c53472e1a3 src/queue.h --- /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; +} diff -r 470e783fdebe -r a8c53472e1a3 src/sync_dequeue.c --- /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); +} diff -r 470e783fdebe -r a8c53472e1a3 src/sync_enqueue.c --- /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); +}