comparison final_main/chapter5.tex @ 4:6d00f6c9bb8a

update
author mir3636
date Mon, 13 Feb 2017 16:28:35 +0900
parents 72e058e7e594
children a2e61c11df3c
comparison
equal deleted inserted replaced
3:60756523a9fc 4:6d00f6c9bb8a
1 \chapter{Context、stub の自動生成} 1 \chapter{Context、stub の自動生成}
2 2
3 Gears OS では 3 章で述べたように通常の Computation の他に Meta Computation を記述する必要がある。 3 Gears OS では 3 章で述べたように通常の Computation の他に Meta Computation を記述する必要がある。
4 しかし Meta Computation はユーザーが関知すべきではないので perl スクリプトによる自動生成を行った。 4
5 \section{stub の生成}
6
7
5 8
6 \section{Context の生成} 9 \section{Context の生成}
7 Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。 10 Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。
8 Data Gear を取得するために perl スクリプトは context.h を読み宣言された Data Gear を取得する。 11 Data Gear を取得するために perl スクリプトは context の定義 (リスト\ref{context}) を読み宣言された Data Gear を取得する。
9
10 Code Gear は指定された cbc ファイルから stub を見て取得を行う。 12 Code Gear は指定された cbc ファイルから stub を見て取得を行う。
11 13
12 Context で Code Gear の名前とポインタの対応は生成する enum Code によって表現される。 14 Context では Code Gear の名前とポインタの対応は生成する enum Code によって表現される。
13 実際に Code Gear に接続する際は enum Code を指定することで接続を行う。 15 実際に Code Gear に接続する際は enum Code を指定することで接続を行う。
16 取得した Code/Data Gear の enum の定義は enumCode.h、enumData.h に生成される。
17 取得した Code/Data Gear から Context の生成を行うコード (リスト\ref{init_context}) を生成する。
14 18
19 Context には Allocation 等で生成した Data Gear へのポインタが格納されている。
20 Code Gear は Context を通して Data Gear へアクセスする。
21 Data Gear の Allocation を行うコードは dataGearInit.c に生成される。
15 22
23 Data Gear は union Data とその中の struct によって表現される。
24 Context には Data Gear の Data Type の情報が格納されている。
25 この情報から確保される Data Gear のサイズなどを決定する。
26
27 \begin{lstlisting}[frame=lrbt,label=context,caption={\footnotesize context の定義}]
28 #define ALLOCATE_SIZE 20000000
29 #define NEW(type) (type*)(calloc(1, sizeof(type)))
30 #define NEWN(n, type) (type*)(calloc(n, sizeof(type)))
31
32 #define ALLOC_DATA(context, dseg) ({\
33 struct Meta* meta = (struct Meta*)context->heap;\
34 meta->type = D_##dseg;\
35 meta->size = 1;\
36 context->heap += sizeof(struct Meta);\
37 context->data[D_##dseg] = context->heap; context->heap += sizeof(struct dseg); (struct dseg *)context->data[D_##dseg]; })
38
39 #define ALLOCATE(context, t) ({ \
40 struct Meta* meta = (struct Meta*)context->heap;\
41 context->heap += sizeof(struct Meta);\
42 union Data* data = context->heap; \
43 context->heap += sizeof(struct t); \
44 meta->type = D_##t; \
45 meta->size = 1; \
46 data; })
47
48 #define Gearef(context, t) (&(context)->data[D_##t]->t)
49 #define GearImpl(context, intf, name) (Gearef(context, intf)->name->intf.name)
50
51 #include "c/enumCode.h"
52
53 #include "c/enumData.h"
54
55 struct Context {
56 enum Code next;
57 struct Worker* worker;
58 struct TaskManager* taskManager;
59 int codeNum;
60 __code (**code) (struct Context*);
61 void* heapStart;
62 void* heap;
63 long heapLimit;
64 int dataNum;
65 int idgCount; //number of waiting dataGear
66 int odg;
67 int maxOdg;
68 int workerId;
69 union Data **data;
70 };
71
72 union Data {
73 struct Meta {
74 enum DataType type;
75 long size;
76 struct Queue* wait; // tasks waiting this dataGear
77 } meta;
78 struct Task {
79 enum Code code;
80 struct Queue* dataGears;
81 int idsCount;
82 } Task;
83 // Stack Interface
84 struct Stack {
85 union Data* stack;
86 union Data* data;
87 union Data* data1;
88 enum Code whenEmpty;
89 enum Code clear;
90 enum Code push;
91 enum Code pop;
92 enum Code pop2;
93 enum Code isEmpty;
94 enum Code get;
95 enum Code get2;
96 enum Code next;
97 } Stack;
98 // Stack implementations
99 struct SingleLinkedStack {
100 struct Element* top;
101 } SingleLinkedStack;
102 struct Element {
103 union Data* data;
104 struct Element* next;
105 } Element;
106 struct Node {
107 int key; // comparable data segment
108 union Data* value;
109 struct Node* left;
110 struct Node* right;
111 // need to balancing
112 enum Color {
113 Red,
114 Black,
115 } color;
116 } Node;
117 }; // union Data end this is necessary for context generator
118
119 \end{lstlisting}
120
121 \begin{lstlisting}[frame=lrbt,label=init_context,caption={\footnotesize 生成された context}]
122
123 #include <stdlib.h>
124
125 #include "../context.h"
126
127 void initContext(struct Context* context) {
128 context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
129 context->code = (__code(**) (struct Context*)) NEWN(ALLOCATE_SIZE, void*);
130 context->data = NEWN(ALLOCATE_SIZE, union Data*);
131 context->heapStart = NEWN(context->heapLimit, char);
132 context->heap = context->heapStart;
133
134 context->code[C_clearSingleLinkedStack] = clearSingleLinkedStack_stub;
135 context->code[C_exit_code] = exit_code_stub;
136 context->code[C_get2SingleLinkedStack] = get2SingleLinkedStack_stub;
137 context->code[C_getSingleLinkedStack] = getSingleLinkedStack_stub;
138 context->code[C_isEmptySingleLinkedStack] = isEmptySingleLinkedStack_stub;
139 context->code[C_pop2SingleLinkedStack] = pop2SingleLinkedStack_stub;
140 context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub;
141 context->code[C_pushSingleLinkedStack] = pushSingleLinkedStack_stub;
142 context->code[C_stack_test1] = stack_test1_stub;
143 context->code[C_stack_test2] = stack_test2_stub;
144 context->code[C_stack_test3] = stack_test3_stub;
145 context->code[C_stack_test4] = stack_test4_stub;
146 context->code[C_start_code] = start_code_stub;
147
148 #include "dataGearInit.c"
149
150 }
151
152 __code meta(struct Context* context, enum Code next) {
153 // printf("meta %d\n",next);
154 goto (context->code[next])(context);
155 }
156
157 __code start_code(struct Context* context) {
158 goto meta(context, context->next);
159 }
160
161 __code start_code_stub(struct Context* context) {
162 goto start_code(context);
163 }
164
165 __code exit_code(struct Context* context) {
166 free(context->code);
167 free(context->data);
168 free(context->heapStart);
169 goto exit(0);
170 }
171
172 __code exit_code_stub(struct Context* context) {
173 goto exit_code(context);
174 }
175
176 // end context_c
177 \end{lstlisting}
16 %enum で Code Gear と Data Gear 178 %enum で Code Gear と Data Gear
17 %Data Gear の typedef 179 %Data Gear の typedef
18 %stub の extern 180 %stub の extern
19 %Data Gear の init (ALLOCA) 181 %Data Gear の init (ALLOCA)
20 %target 毎の init context 182 %target 毎の init context