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)