diff final_main/chapter5.tex @ 4:6d00f6c9bb8a

update
author mir3636
date Mon, 13 Feb 2017 16:28:35 +0900
parents 72e058e7e594
children a2e61c11df3c
line wrap: on
line diff
--- a/final_main/chapter5.tex	Sun Feb 12 19:03:28 2017 +0900
+++ b/final_main/chapter5.tex	Mon Feb 13 16:28:35 2017 +0900
@@ -1,18 +1,180 @@
 \chapter{Context、stub の自動生成}
 
 Gears OS では 3 章で述べたように通常の Computation の他に Meta Computation を記述する必要がある。
-しかし Meta Computation はユーザーが関知すべきではないので perl スクリプトによる自動生成を行った。
+
+\section{stub の生成}
+
+
 
 \section{Context の生成}
 Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。
-Data Gear を取得するために perl スクリプトは context.h を読み宣言された Data Gear を取得する。
-
+Data Gear を取得するために perl スクリプトは context の定義 (リスト\ref{context}) を読み宣言された Data Gear を取得する。
 Code Gear は指定された cbc ファイルから stub を見て取得を行う。
 
-Context で Code Gear の名前とポインタの対応は生成する enum Code によって表現される。
+Context では Code Gear の名前とポインタの対応は生成する enum Code によって表現される。
 実際に Code Gear に接続する際は enum Code を指定することで接続を行う。
+取得した Code/Data Gear の enum の定義は enumCode.h、enumData.h に生成される。
+取得した Code/Data Gear から Context の生成を行うコード (リスト\ref{init_context}) を生成する。
 
+Context には Allocation 等で生成した Data Gear へのポインタが格納されている。
+Code Gear は Context を通して Data Gear へアクセスする。
+Data Gear の Allocation を行うコードは dataGearInit.c に生成される。
 
+Data Gear は union Data とその中の struct によって表現される。
+Context には Data Gear の Data Type の情報が格納されている。
+この情報から確保される Data Gear のサイズなどを決定する。
+
+\begin{lstlisting}[frame=lrbt,label=context,caption={\footnotesize context の定義}]
+#define ALLOCATE_SIZE 20000000
+#define NEW(type) (type*)(calloc(1, sizeof(type)))
+#define NEWN(n, type) (type*)(calloc(n, sizeof(type)))
+
+#define ALLOC_DATA(context, dseg) ({\
+    struct Meta* meta = (struct Meta*)context->heap;\
+    meta->type = D_##dseg;\
+    meta->size = 1;\
+    context->heap += sizeof(struct Meta);\
+    context->data[D_##dseg] = context->heap; context->heap += sizeof(struct dseg); (struct dseg *)context->data[D_##dseg]; })
+
+#define ALLOCATE(context, t) ({ \
+    struct Meta* meta = (struct Meta*)context->heap;\
+    context->heap += sizeof(struct Meta);\
+    union Data* data = context->heap; \
+    context->heap += sizeof(struct t); \
+    meta->type = D_##t; \
+    meta->size = 1;     \
+    data; })
+
+#define Gearef(context, t) (&(context)->data[D_##t]->t)
+#define GearImpl(context, intf, name) (Gearef(context, intf)->name->intf.name) 
+
+#include "c/enumCode.h"
+
+#include "c/enumData.h"
+
+struct Context {
+    enum Code next;
+    struct Worker* worker;
+    struct TaskManager* taskManager;
+    int codeNum;
+    __code (**code) (struct Context*);
+    void* heapStart;
+    void* heap;
+    long heapLimit;
+    int dataNum;
+    int idgCount; //number of waiting dataGear
+    int odg;
+    int maxOdg;
+    int workerId;
+    union Data **data;
+};
+
+union Data {
+    struct Meta {
+        enum DataType type;
+        long size;
+        struct Queue* wait; // tasks waiting this dataGear
+    } meta;
+    struct Task {
+        enum Code code;
+        struct Queue* dataGears;
+        int idsCount;
+    } Task;
+    // Stack Interface
+    struct Stack {
+        union Data* stack;
+        union Data* data;
+        union Data* data1;
+        enum Code whenEmpty;
+        enum Code clear;
+        enum Code push;
+        enum Code pop;
+        enum Code pop2;
+        enum Code isEmpty;
+        enum Code get;
+        enum Code get2;
+        enum Code next;
+    } Stack;
+    // Stack implementations
+    struct SingleLinkedStack {
+        struct Element* top;
+    } SingleLinkedStack;
+    struct Element {
+        union Data* data;
+        struct Element* next;
+    } Element;
+    struct Node {
+        int key; // comparable data segment
+        union Data* value;
+        struct Node* left;
+        struct Node* right;
+        // need to balancing
+        enum Color {
+            Red,
+            Black,
+        } color;
+    } Node;
+}; // union Data end       this is necessary for context generator
+
+\end{lstlisting}
+
+\begin{lstlisting}[frame=lrbt,label=init_context,caption={\footnotesize 生成された context}]
+
+#include <stdlib.h>
+
+#include "../context.h"
+
+void initContext(struct Context* context) {
+    context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
+    context->code = (__code(**) (struct Context*)) NEWN(ALLOCATE_SIZE, void*);
+    context->data = NEWN(ALLOCATE_SIZE, union Data*);
+    context->heapStart = NEWN(context->heapLimit, char);
+    context->heap = context->heapStart;
+
+    context->code[C_clearSingleLinkedStack]    = clearSingleLinkedStack_stub;
+    context->code[C_exit_code]    = exit_code_stub;
+    context->code[C_get2SingleLinkedStack]    = get2SingleLinkedStack_stub;
+    context->code[C_getSingleLinkedStack]    = getSingleLinkedStack_stub;
+    context->code[C_isEmptySingleLinkedStack]    = isEmptySingleLinkedStack_stub;
+    context->code[C_pop2SingleLinkedStack]    = pop2SingleLinkedStack_stub;
+    context->code[C_popSingleLinkedStack]    = popSingleLinkedStack_stub;
+    context->code[C_pushSingleLinkedStack]    = pushSingleLinkedStack_stub;
+    context->code[C_stack_test1]    = stack_test1_stub;
+    context->code[C_stack_test2]    = stack_test2_stub;
+    context->code[C_stack_test3]    = stack_test3_stub;
+    context->code[C_stack_test4]    = stack_test4_stub;
+    context->code[C_start_code]    = start_code_stub;
+
+#include "dataGearInit.c"
+
+}
+
+__code meta(struct Context* context, enum Code next) {
+    // printf("meta %d\n",next);
+    goto (context->code[next])(context);
+}
+
+__code start_code(struct Context* context) {
+    goto meta(context, context->next);
+}
+
+__code start_code_stub(struct Context* context) {
+    goto start_code(context);
+}
+
+__code exit_code(struct Context* context) {
+    free(context->code);
+    free(context->data);
+    free(context->heapStart);
+    goto exit(0);
+}
+
+__code exit_code_stub(struct Context* context) {
+    goto exit_code(context);
+}    
+
+// end context_c
+\end{lstlisting}
 %enum で Code Gear と Data Gear
 %Data Gear の typedef
 %stub の extern