0
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
|
3
|
|
4 #include "Task.h"
|
|
5
|
|
6 #define __DEBUG(f, args...) \
|
|
7 fprintf(stderr, "in %s: "f, __FUNCTION__, ## args)
|
|
8
|
2
|
9
|
|
10 void * allocate (size_t size);
|
|
11
|
|
12 __code taskA_0(void *tsched, void *rbuff, void *wbuff);
|
|
13 __code taskA_1(void *tsched, void *rbuff, void *wbuff);
|
|
14 __code taskA_2(void *tsched, void *rbuff, void *wbuff);
|
|
15 __code task0 (void *tsched, void *rbuff, void *wbuff);
|
|
16 __code task1 (void *tsched, void *rbuff, void *wbuff);
|
|
17 __code task2 (void *tsched, void *rbuff, void *wbuff);
|
0
|
18 int main (int argc, char **argv);
|
2
|
19 __code startcode (void *tsched, void *arg);
|
|
20 __code checkNewCode (void *tsched, int wait);
|
|
21 __code exitCode (void *tsched, int id);
|
0
|
22 void * allocate (size_t size);
|
|
23
|
|
24 #define NUM 3
|
|
25 __code
|
2
|
26 taskA_0(void *tsched, void *rbuff, void *wbuff)
|
|
27 {
|
|
28 int i,j;
|
|
29 double *t;
|
|
30 int *count=rbuff;
|
|
31
|
|
32 t = wbuff;
|
|
33 double *result[NUM] = { t, t+3, t+6 };
|
|
34 for (i=0; i<NUM; i++) {
|
|
35 for (j=0; j<NUM; j++) {
|
|
36 if (i==j) result[i][j] = 1.0;
|
|
37 else result[i][j] = 0.0;
|
|
38 }
|
|
39 }
|
|
40
|
|
41 t = (double*)(count+1);
|
|
42 double *base[NUM] = { t, t+3, t+6 };
|
|
43 printf("count = %d\n", *count);
|
|
44 printf("base = \n");
|
|
45 for (i=0; i<NUM; i++) {
|
|
46 printf("%lf, %lf, %lf\n", base[i][0], base[i][1], base[i][2]);
|
|
47 }
|
|
48
|
|
49 goto scheduler(tsched, taskA_1,rbuff,wbuff);
|
|
50 }
|
|
51 __code
|
|
52 taskA_1(void *tsched, void *rbuff, void *wbuff)
|
|
53 {
|
|
54 int i,j,k;
|
|
55 int *count = rbuff;
|
|
56 double *t;
|
|
57 double prod[NUM][NUM];
|
|
58
|
|
59 t = (double*)(count+1);
|
|
60 double *base[NUM] = { t, t+3, t+6 };
|
|
61 t = wbuff;
|
|
62 double *result[NUM] = { t, t+3, t+6 };
|
|
63
|
|
64 if (*count <= 0) {
|
|
65 //__DEBUG("task end\n", *count);
|
|
66 goto scheduler(tsched, taskA_2,rbuff,wbuff);
|
|
67 }
|
|
68 for (i=0; i<NUM; i++) {
|
|
69 for (j=0; j<NUM; j++) {
|
|
70 prod[i][j] = 0;
|
|
71 for (k=0; k<NUM; k++) {
|
|
72 prod[i][j] += result[j][k] * base[k][i];
|
|
73 }
|
|
74 }
|
|
75 }
|
|
76 for (i=0; i<NUM; i++) {
|
|
77 for (j=0; j<NUM; j++) {
|
|
78 result[i][j] = prod[i][j];
|
|
79 }
|
|
80 }
|
|
81
|
|
82 //__DEBUG("count=%d\n", *count);
|
|
83 (*count)--;
|
|
84 goto scheduler(tsched, taskA_1, rbuff, wbuff);
|
|
85 }
|
|
86 __code
|
|
87 taskA_2(void *tsched, void *rbuff, void *wbuff)
|
|
88 {
|
|
89 int i;
|
|
90 double *t;
|
|
91
|
|
92 t = wbuff;
|
|
93 double *result[NUM] = { t, t+3, t+6 };
|
|
94 printf("result = \n");
|
|
95 for (i=0; i<NUM; i++) {
|
|
96 printf("%lf, %lf, %lf\n", result[i][0], result[i][1], result[i][2]);
|
|
97 }
|
|
98
|
|
99 goto scheduler(tsched, END,NULL,NULL);
|
|
100 }
|
|
101 __code
|
|
102 task0(void *tsched, void *rbuff, void *wbuff)
|
0
|
103 {
|
|
104 int i,j;
|
|
105 double *in = rbuff;
|
|
106 double *out = wbuff;
|
|
107 double a[NUM][NUM] = {
|
|
108 { 1.0, 0.0, 0.0 },
|
|
109 { 0.0, 1.0, 0.0 },
|
|
110 { 0.0, 0.0, 1.0 },
|
|
111 };
|
|
112 for (i=0; i<NUM; i++) {
|
|
113 out[i] = 0.0;
|
|
114 for (j=0; j<NUM; j++) {
|
|
115 out[i] += a[i][j] * in[j];
|
|
116 }
|
|
117 }
|
|
118 __DEBUG("\n");
|
1
|
119 __DEBUG("%p %p\n", rbuff, wbuff);
|
|
120 __DEBUG("%3.2lf %3.2lf %3.2lf\n", in[0],in[1],in[2]);
|
|
121 __DEBUG("%3.2lf %3.2lf %3.2lf\n", out[0],out[1],out[2]);
|
|
122 //goto task1(scheduler, wbuff, rbuff);
|
2
|
123 goto scheduler(tsched, task1, wbuff, rbuff);
|
0
|
124 }
|
|
125 __code
|
2
|
126 task1(void *tsched, void *rbuff, void *wbuff)
|
0
|
127 {
|
|
128 int i,j;
|
|
129 double *in = rbuff;
|
|
130 double *out = wbuff;
|
|
131 double a[NUM][NUM] = {
|
|
132 { 1.0, 0.0, 0.0 },
|
1
|
133 { 0.0, 2.0, 0.0 },
|
|
134 { 0.0, 0.0, 3.0 },
|
0
|
135 };
|
|
136 for (i=0; i<NUM; i++) {
|
|
137 out[i] = 0.0;
|
|
138 for (j=0; j<NUM; j++) {
|
|
139 out[i] += a[i][j] * in[j];
|
|
140 }
|
|
141 }
|
|
142 __DEBUG("\n");
|
1
|
143 __DEBUG("%p %p\n", rbuff, wbuff);
|
|
144 __DEBUG("%3.2lf %3.2lf %3.2lf\n", in[0],in[1],in[2]);
|
|
145 __DEBUG("%3.2lf %3.2lf %3.2lf\n", out[0],out[1],out[2]);
|
2
|
146 //goto task2(tsched, wbuff, rbuff);
|
|
147 goto scheduler(tsched, task2, wbuff, rbuff);
|
0
|
148 }
|
|
149 __code
|
2
|
150 task2(void *tsched, void *rbuff, void *wbuff)
|
0
|
151 {
|
|
152 int i,j;
|
|
153 double *in = rbuff;
|
|
154 double *out = wbuff;
|
|
155 double a[NUM][NUM] = {
|
|
156 { 1.0, 0.0, 0.0 },
|
|
157 { 0.0, 1.0, 0.0 },
|
|
158 { 0.0, 0.0, 1.0 },
|
|
159 };
|
|
160 for (i=0; i<NUM; i++) {
|
|
161 out[i] = 0.0;
|
|
162 for (j=0; j<NUM; j++) {
|
|
163 out[i] += a[i][j] * in[j];
|
|
164 }
|
|
165 }
|
|
166 __DEBUG("\n");
|
1
|
167 __DEBUG("%p %p\n", rbuff, wbuff);
|
|
168 __DEBUG("%3.2lf %3.2lf %3.2lf\n", in[0],in[1],in[2]);
|
|
169 __DEBUG("%3.2lf %3.2lf %3.2lf\n", out[0],out[1],out[2]);
|
2
|
170 goto scheduler(tsched, END, rbuff, wbuff);
|
0
|
171 }
|
|
172
|
2
|
173 #include "TaskScheduler.h"
|
0
|
174
|
|
175 int
|
|
176 main(int argc, char **argv)
|
|
177 {
|
|
178 __DEBUG("\n");
|
|
179 goto initScheduler(startcode, NULL);
|
|
180 return 0;
|
|
181 }
|
|
182
|
1
|
183 __code
|
2
|
184 startcode(void *tsched, void *arg) {
|
|
185 int i,j;
|
1
|
186 double *readbuff, *writebuff;
|
2
|
187 readbuff = malloc(sizeof(int)+sizeof(double)*NUM*NUM);
|
|
188 writebuff = malloc(sizeof(double)*NUM*NUM);
|
|
189
|
|
190 int *count = (int*)readbuff;
|
|
191 double *t = (double*)(count+1);
|
|
192 double *base[NUM] = { t, t+3, t+6 };
|
0
|
193
|
2
|
194 *count = 2;
|
|
195 for (i=0; i<NUM; i++) {
|
|
196 for (j=0; j<NUM; j++) {
|
|
197 if (i==j) base[i][j] = 1.0;
|
|
198 else base[i][j] = 0.0;
|
|
199 }
|
|
200 }
|
|
201 base[0][0] = 2.0;
|
|
202 base[2][1] = 0.5;
|
|
203
|
1
|
204 __DEBUG("id=0 added.\n");
|
2
|
205 goto addCode(tsched, 0, taskA_0, readbuff, writebuff);
|
0
|
206 }
|
|
207
|
|
208 __code
|
2
|
209 checkNewCode(void *tsched, int wait)
|
0
|
210 {
|
1
|
211 static int t = 0;
|
|
212 double *readbuff, *writebuff;
|
|
213
|
|
214 if (wait) {
|
|
215 __DEBUG("all tasks finished\n");
|
|
216 exit(0);
|
|
217 }
|
|
218
|
2
|
219 /*
|
1
|
220 if (t==0) {
|
2
|
221 readbuff = malloc(sizeof(double)*NUM);
|
|
222 writebuff = malloc(sizeof(double)*NUM);
|
1
|
223 t++;
|
|
224 __DEBUG("id=1 added.\n");
|
2
|
225 goto addCode(tsched, 1, taskA, readbuff, writebuff);
|
1
|
226 }
|
2
|
227 */
|
1
|
228 __DEBUG("no code added.\n");
|
2
|
229 goto selectCode(tsched);
|
0
|
230 }
|
|
231
|
|
232 __code
|
2
|
233 exitCode(void *tsched, int id)
|
0
|
234 {
|
1
|
235 __DEBUG("exit task%d\n", id);
|
2
|
236 goto selectCode(tsched);
|
0
|
237 }
|
|
238
|
|
239 void *
|
|
240 allocate(size_t size)
|
|
241 {
|
|
242 void *rtn = malloc (size);
|
|
243 if (!rtn) {
|
|
244 perror("malloc");
|
|
245 exit(1);
|
|
246 }
|
|
247 return rtn;
|
|
248 }
|
|
249
|
|
250
|
|
251
|
2
|
252
|