Mercurial > hg > Game > Cerium
comparison example/many_task/sort.cc @ 940:e01b551f25d6 draft
unknown dead lock still...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 31 Jul 2010 16:44:10 +0900 |
parents | aafa99c856a3 |
children | fc6cfaae6de7 |
comparison
equal
deleted
inserted
replaced
939:aafa99c856a3 | 940:e01b551f25d6 |
---|---|
2 #include "SchedTask.h" | 2 #include "SchedTask.h" |
3 #include "sort.h" | 3 #include "sort.h" |
4 #include "Func.h" | 4 #include "Func.h" |
5 #include <string.h> | 5 #include <string.h> |
6 | 6 |
7 extern void check_data(); | |
8 extern int all; // allocate task at once | |
9 | |
7 static void sort_start(SchedTask *); | 10 static void sort_start(SchedTask *); |
8 extern void check_data(); | 11 static int data_length; |
9 | 12 static int cpuNum; |
10 static DataPtr data; | 13 static int split_num; |
11 static int data_length; | |
12 static int cpuNum; | |
13 | |
14 extern int all; | |
15 | 14 |
16 /** | 15 /** |
17 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような | 16 * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような |
18 * len の分割数を返す | 17 * len の分割数を返す |
19 * | 18 * |
35 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE; | 34 return (len + MAX_BLOCK_SIZE - 1) / MAX_BLOCK_SIZE; |
36 } | 35 } |
37 } | 36 } |
38 | 37 |
39 | 38 |
40 HTaskPtr *fsort; | 39 static HTaskPtr *fsort; |
41 HTaskPtr *bsort; | 40 static HTaskPtr *bsort; |
42 int split_num; | 41 |
43 | 42 static DataPtr data; |
44 | 43 |
45 /** | 44 /** |
46 * btask が全て終了したら、再び sort_start を実行する | 45 * btask が全て終了したら、再び sort_start を実行する |
47 * @param d 生成された btask の数 | 46 * @param d 生成された btask の数 |
48 */ | 47 */ |
216 bsort[i]->wait_for(fsort[i+1]); | 215 bsort[i]->wait_for(fsort[i+1]); |
217 bsort[i]->spawn(); | 216 bsort[i]->spawn(); |
218 } | 217 } |
219 } | 218 } |
220 | 219 |
221 HTask *restart = manager->create_task(RESTART,0,0,0,0); | 220 HTaskPtr restart = manager->create_task(RESTART,0,0,0,0); |
222 for (int i = 0; i < split_num; i++) { | 221 for (int i = 0; i < split_num; i++) { |
223 if (!all) restart->wait_for(fsort[i]); | 222 if (!all) restart->wait_for(fsort[i]); |
224 fsort[i]->spawn(); | 223 fsort[i]->spawn(); |
225 } | 224 } |
226 restart->spawn(); | 225 restart->spawn(); |
227 | 226 } |
228 } | 227 |
229 #endif | 228 #endif |
230 | 229 |
231 void check_data() | 230 void check_data() |
232 { | 231 { |
233 int flag = 1; | |
234 for(int i=0; i< data_length-1;i++) { | 232 for(int i=0; i< data_length-1;i++) { |
235 if (data[i].index>data[i+1].index) { | 233 if (data[i].index>data[i+1].index) { |
236 printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index); | 234 printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index); |
237 flag = 0; | 235 return; |
238 break; | 236 } |
239 } | 237 } |
240 } | 238 printf("Data are sorted\n"); |
241 if (flag) printf("Data are sorted\n"); | |
242 } | 239 } |
243 | 240 |
244 | 241 |
245 void | 242 void |
246 sort_init(SchedTask *manager, void *a, void *b) | 243 sort_init(SchedTask *manager, void *a, void *b) |