Mercurial > hg > Papers > 2017 > mitsuki-thesis
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 |