changeset 72:951cb9681030

add source code
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 04 Feb 2021 14:54:44 +0900
parents d2aa3709bfc8
children e1842c36937e
files paper/chapter/03-gears.tex paper/chapter/04-interface.tex paper/master_paper.pdf paper/src/SingleLinkedStack.c paper/src/SingleLinkedStack.cbc paper/src/StackPush.c paper/src/StackPush.cbc paper/src/enumCode.h paper/src/enumData.h paper/src/gearef.h paper/src/structContext.h
diffstat 11 files changed, 360 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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{(...)}を渡す。
--- 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
Binary file paper/master_paper.pdf has changed
--- /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 <stdio.h>
+
+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);
+}
+
--- /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 <stdio.h>
+
+#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(...);
+    }
+}
+
+
--- /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);
+}
+
--- /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(...);
+}
+
--- /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,
+    ...
+};
--- /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,
+    ...
+};
+
--- /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)
--- /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;
+};