# HG changeset patch # User anatofuz # Date 1612418084 -32400 # Node ID 951cb9681030cef36450f1a25d8198f715f9f102 # Parent d2aa3709bfc8980157baf2e79e66c8d37af1ae17 add source code diff -r d2aa3709bfc8 -r 951cb9681030 paper/chapter/03-gears.tex --- a/paper/chapter/03-gears.tex Thu Feb 04 14:14:51 2021 +0900 +++ b/paper/chapter/03-gears.tex Thu Feb 04 14:54:44 2021 +0900 @@ -88,6 +88,7 @@ しかしノーマルレベルから次のCodeGearに継続する場合は関数ポインタなどが必要になるが、 これらはメタ計算に含まれる。 その為純粋にノーマルレベルからCodeGear間を自由に継続させてしまうと、 ノーマルレベルとメタレベルの分離ができなくなってしまう。 ノーマルレベルとメタレベルの分離の為に、 次のCodeGearには直接継続させず、間にMetaCodeGearをはさむようにする必要がある。 +またポインタをノーマルレベルには持たせず、 継続先のCodeGearは番号を使って指定する。 CodeGear間の継続はGearsOSのビルド時にPerlスクリプトによって書き換えが行われ、MetaCodeGearを経由するように変更される。 GearsOSではDataGearはすべてContextを経由してやり取りをする。 @@ -104,6 +105,13 @@ これらの引数は生成された\texttt{pushSingleLinkedStack\_stub}がContextの特定の場所から取り出す。 このCodeGearはGearsOSのInterfaceを利用しており、 Stack Interaceの実装となっている。 マクロ\texttt{Gearef}は、 contextのInterface用のDataGearの置き場所にアクセスするマクロであり、 Stack Interfaceの置き場所から、引数情報を取得している。 +マクロ\texttt{Gearef}の定義をソースコード\ref{src:gearef}に示す。 +マクロ\texttt{Gearef}では引数で与えられたDataGearの名前を、enumを利用した番号に変換し、contextから値を取り出している。 +DataGearは\texttt{enum Data}型で各DataGearの型ごとに番号が割り振られている。(ソースコード\ref{src:enumData}) +\lstinputlisting[label=src:gearef, caption=Gearefマクロ]{src/gearef.h} +\lstinputlisting[label=src:enumData, caption=enumDataの定義]{src/enumData.h} + + すべての引数を取得したのちに、\texttt{goto pushSingleLinkedStack}で、CodeGearに継続する。 \lstinputlisting[label=src:StackPush, caption=StackにPushするCodeGear]{src/StackPush.cbc} \lstinputlisting[label=src:StackPushStub, caption=\ref{src:StackPush}のStubCodeGear]{src/StackPush.c} @@ -122,12 +130,16 @@ \texttt{\_\_code meta}の定義をソースコード\ref{src:meta}に示す。 +\lstinputlisting[label=src:meta, caption=\_\_code meta]{src/meta.cbc} \texttt{\_\_code meta}はContextに格納されているCodeGearの配列からCodeGearのアドレスを取得し継続する。 この際に配列の要素を特定する際に使われる添え字は、 各CodeGearに割り振られた番号を利用している。 この番号はC言語の列挙体を使用した\texttt{enum Code}型で定義されている。 +\texttt{enum Code}型の定義をソースコード\ref{src:enumCode}に示す。 +命名規則は\texttt{C\_CodeGearName}となっている。 +\lstinputlisting[label=src:enumCode, caption=CodeGearの番号であるenumCodeの定義]{src/enumCode.h} \texttt{enum Code}型はGearsOSのコンパイル時に利用されているCodeGearを数え上げて生成される。 -継続する先のCodeGearは、呼び出し先のCodeGearの直前に実行されるStubCodeGearである。 -\lstinputlisting[label=src:meta, caption=\_\_code meta]{src/meta.cbc} +Contextのcode配列には、各CodeGearのStubCodeGearの関数ポインタが配置されている。 +よって\texttt{\_\_code meta}から継続する先のCodeGearは、呼び出し先のCodeGearの直前に実行されるStubCodeGearになる。 CodeGearからCodeGearへの継続は、関数型プログラミングの継続先に渡すDataとCodeの組のClosureとなっている。 シンタックスでは継続の際に引数\texttt{(...)}を渡す。 diff -r d2aa3709bfc8 -r 951cb9681030 paper/chapter/04-interface.tex --- a/paper/chapter/04-interface.tex Thu Feb 04 14:14:51 2021 +0900 +++ b/paper/chapter/04-interface.tex Thu Feb 04 14:54:44 2021 +0900 @@ -226,4 +226,6 @@ \section{Interfaceの引数の検知} -\section{InterfaceのAPIの未実装の検知} \ No newline at end of file +\section{InterfaceのAPIの未実装の検知} + +\section{par goto のInterface経由の呼び出しの対応} \ No newline at end of file diff -r d2aa3709bfc8 -r 951cb9681030 paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/SingleLinkedStack.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/SingleLinkedStack.c Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,172 @@ +#include "../context.h" +#include + +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = &ALLOCATE(context, Stack)->Stack; + struct SingleLinkedStack* single_linked_stack = &ALLOCATE(context, SingleLinkedStack)->SingleLinkedStack; + stack->stack = (union Data*)single_linked_stack; + stack->data = NULL; + stack->data1 = NULL; + single_linked_stack->top = NULL; + stack->clear = C_clearSingleLinkedStack; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->pop2 = C_pop2SingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->get = C_getSingleLinkedStack; + stack->get2 = C_get2SingleLinkedStack; + return stack; +} +// include "Node.h" + + +void printStack1(union Data* data) { + struct Node* node = &data->Element.data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d ,", node->key); + printStack1((union Data*)data->Element.next); + } +} + +void printStack(union Data* data) { + printStack1(data); + printf("\n"); +} + +__code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) { + stack->top = NULL; + goto meta(context, next); +} + +__code clearSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + goto clearSingleLinkedStack(context, stack, next); +} + +__code pushSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, union Data* data, enum Code next) { + Element* element = &ALLOCATE(context, Element)->Element; + element->next = stack->top; + element->data = data; + stack->top = element; + goto meta(context, next); +} + +__code pushSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + Data* data = Gearef(context, Stack)->data; + enum Code next = Gearef(context, Stack)->next; + goto pushSingleLinkedStack(context, stack, data, next); +} + +__code popSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data) { + Data* data __attribute__((unused)) = *O_data; + if (stack->top) { + data = stack->top->data; + stack->top = stack->top->next; + } else { + data = NULL; + } + *O_data = data; + goto meta(context, next); +} + +__code popSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + Data** O_data = &Gearef(context, Stack)->data; + goto popSingleLinkedStack(context, stack, next, O_data); +} + +__code pop2SingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data,union Data **O_data1) { + Data* data __attribute__((unused)) = *O_data; + Data* data1 __attribute__((unused)) = *O_data1; + if (stack->top) { + data = stack->top->data; + stack->top = stack->top->next; + } else { + data = NULL; + } + if (stack->top) { + data1 = stack->top->data; + stack->top = stack->top->next; + } else { + data1 = NULL; + } + *O_data = data; + *O_data1 = data1; + goto meta(context, next); +} + + +__code pop2SingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + Data** O_data = &Gearef(context, Stack)->data; + Data** O_data1 = &Gearef(context, Stack)->data1; + goto pop2SingleLinkedStack(context, stack, next, O_data, O_data1); +} + +__code getSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data) { + Data* data __attribute__((unused)) = *O_data; + if (stack->top) { + data = stack->top->data; + } else { + data = NULL; + } + *O_data = data; + goto meta(context, next); +} + +__code getSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + Data** O_data = &Gearef(context, Stack)->data; + goto getSingleLinkedStack(context, stack, next, O_data); +} + +__code get2SingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data,union Data **O_data1) { + Data* data __attribute__((unused)) = *O_data; + Data* data1 __attribute__((unused)) = *O_data1; + if (stack->top) { + data = stack->top->data; + if (stack->top->next) { + data1 = stack->top->next->data; + } else { + data1 = NULL; + } + } else { + data = NULL; + data1 = NULL; + } + *O_data = data; + *O_data1 = data1; + goto meta(context, next); +} + +__code get2SingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + Data** O_data = &Gearef(context, Stack)->data; + Data** O_data1 = &Gearef(context, Stack)->data1; + goto get2SingleLinkedStack(context, stack, next, O_data, O_data1); +} + +__code isEmptySingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next, enum Code whenEmpty) { + if (stack->top) { + goto meta(context, next); + } else { + goto meta(context, whenEmpty); + } +} + + +__code isEmptySingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + enum Code whenEmpty = Gearef(context, Stack)->whenEmpty; + goto isEmptySingleLinkedStack(context, stack, next, whenEmpty); +} + diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/SingleLinkedStack.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/SingleLinkedStack.cbc Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,95 @@ +#include "../context.h" +#include + +#impl "Stack.h" for "SingleLinkedStack.h" +#data "Node.h" + + +void printStack1(union Data* data) { + struct Node* node = &data->Element.data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d ,", node->key); + printStack1((union Data*)data->Element.next); + } +} + +void printStack(union Data* data) { + printStack1(data); + printf("\n"); +} + +__code clearSingleLinkedStack(struct SingleLinkedStack* stack,__code next(...)) { + stack->top = NULL; + goto next(...); +} + +__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { + Element* element = new Element(); + element->next = stack->top; + element->data = data; + stack->top = element; + goto next(...); +} + +__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { + if (stack->top) { + data = stack->top->data; + stack->top = stack->top->next; + } else { + data = NULL; + } + goto next(data, ...); +} + +__code pop2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) { + if (stack->top) { + data = stack->top->data; + stack->top = stack->top->next; + } else { + data = NULL; + } + if (stack->top) { + data1 = stack->top->data; + stack->top = stack->top->next; + } else { + data1 = NULL; + } + goto next(data, data1, ...); +} + + +__code getSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { + if (stack->top) { + data = stack->top->data; + } else { + data = NULL; + } + goto next(data, ...); +} + +__code get2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) { + if (stack->top) { + data = stack->top->data; + if (stack->top->next) { + data1 = stack->top->next->data; + } else { + data1 = NULL; + } + } else { + data = NULL; + data1 = NULL; + } + goto next(data, data1, ...); +} + +__code isEmptySingleLinkedStack(struct SingleLinkedStack* stack, __code next(...), __code whenEmpty(...)) { + if (stack->top) { + goto next(...); + } else { + goto whenEmpty(...); + } +} + + diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/StackPush.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/StackPush.c Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,15 @@ +__code pushSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, union Data* data, enum Code next) { + Element* element = &ALLOCATE(context, Element)->Element; + element->next = stack->top; + element->data = data; + stack->top = element; + goto meta(context, next); +} + +__code pushSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + Data* data = Gearef(context, Stack)->data; + enum Code next = Gearef(context, Stack)->next; + goto pushSingleLinkedStack(context, stack, data, next); +} + diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/StackPush.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/StackPush.cbc Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,8 @@ +__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { + Element* element = new Element(); + element->next = stack->top; + element->data = data; + stack->top = element; + goto next(...); +} + diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/enumCode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/enumCode.h Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,10 @@ +enum Code { + C_checkAndSetAtomicReference, + C_clearSingleLinkedStack, + C_clearSynchronizedQueue, + C_createTask, + C_decrementTaskCountTaskManagerImpl, + C_exit_code, + C_get2SingleLinkedStack, + ... +}; diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/enumData.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/enumData.h Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,10 @@ +enum DataType { + D_Code, + D_Atomic, + D_AtomicReference, + D_CPUWorker, + D_Context, + D_Element, + ... +}; + diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/gearef.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/gearef.h Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,1 @@ +#define Gearef(context, t) (&(context)->data[D_##t]->t) diff -r d2aa3709bfc8 -r 951cb9681030 paper/src/structContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/structContext.h Thu Feb 04 14:54:44 2021 +0900 @@ -0,0 +1,32 @@ +struct Context { + enum Code next; + struct Worker* worker; + struct TaskManager* taskManager; + int codeNum; + __code (**code) (struct Context*); + union Data **data; + struct Meta **metaDataStart; + struct Meta **metaData; + void* heapStart; + void* heap; + long heapLimit; + int dataNum; + + // task parameter + int idgCount; //number of waiting dataGear + int idg; + int maxIdg; + int odg; + int maxOdg; + int gpu; // GPU task + struct Context* task; + struct Element* taskList; +#ifdef USE_CUDAWorker + int num_exec; + CUmodule module; + CUfunction function; +#endif + /* multi dimension parameter */ + int iterate; + struct Iterator* iterator; +};