0
|
1 #ifndef INCLUDED_TASK_MANAGER_IMPL
|
|
2 #define INCLUDED_TASK_MANAGER_IMPL
|
|
3
|
|
4 #include "MailManager.h"
|
|
5 #include "ListData.h"
|
|
6 #include "QueueInfo.h"
|
|
7 #include "TaskQueue.h"
|
|
8 #include "HTask.h"
|
|
9 #include "Scheduler.h"
|
|
10 class MemList;
|
|
11
|
|
12 extern QueueInfo<TaskQueue> *taskQueuePool ;
|
|
13 extern QueueInfo<HTask> *htaskPool ;
|
|
14 extern QueueInfo<TaskList> *taskListPool;
|
|
15
|
|
16
|
|
17
|
|
18 class TaskManagerImpl {
|
|
19 public:
|
|
20
|
|
21 /* variables */
|
|
22 int machineNum;
|
|
23 QueueInfo<HTask> *activeTaskQueue;
|
|
24 QueueInfo<HTask> *waitTaskQueue;
|
|
25
|
|
26 QueueInfo<TaskQueue> *taskQueueImpl;
|
|
27 QueueInfo<HTask> *htaskImpl;
|
|
28
|
|
29 SchedTask *schedTaskManager;
|
|
30 Scheduler *scheduler;
|
|
31 TaskManagerImpl *others;
|
|
32
|
|
33 /* constructor */
|
|
34 TaskManagerImpl(int num = 1) ;
|
|
35
|
|
36 virtual ~TaskManagerImpl() { }
|
|
37
|
|
38 /* functions */
|
|
39 // system
|
|
40 virtual void init() = 0;
|
|
41 virtual void run() = 0;
|
|
42 virtual void start_profile() = 0;
|
|
43 virtual void show_profile() = 0;
|
|
44 virtual void append_activeTask(HTaskPtr);
|
|
45 virtual void append_waitTask(HTaskPtr);
|
|
46 virtual void polling() = 0;
|
|
47
|
|
48 void check_task_finish(HTaskPtr task, QueueInfo<HTask> *wait_queue);
|
|
49 void check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue);
|
|
50
|
|
51 void systask_init();
|
|
52
|
|
53 // user
|
|
54 virtual HTaskPtr create_task(int cmd,void *from);
|
|
55 virtual HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size,void *from);
|
|
56 virtual HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData,void *from);
|
|
57 virtual void set_task_depend(HTaskPtr master, HTaskPtr slave);
|
|
58 virtual void spawn_task(HTaskPtr);
|
|
59 virtual void set_task_cpu(HTaskPtr, CPU_TYPE);
|
|
60 void set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList) ;
|
|
61
|
|
62 void free_htask(HTaskPtr htask) {
|
|
63 #if !defined(__SPU__)
|
|
64 if (htask->self) {
|
|
65 htask->flag.no_auto_free = 0;
|
|
66 return;
|
|
67 }
|
|
68 htaskImpl->free_(htask);
|
|
69 #endif
|
|
70 }
|
|
71
|
|
72 void* allocate(int size, int alignment)
|
|
73 {
|
|
74 void *buff = 0;
|
|
75 if (size==0) return 0;
|
|
76 #if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN)
|
|
77 buff = malloc(size);
|
|
78 #else
|
|
79 posix_memalign(&buff, alignment, size);
|
|
80 #endif
|
|
81 if (buff==0)
|
|
82 get_scheduler()->printf("Can't allocate memory\n");
|
|
83 return buff;
|
|
84 }
|
|
85
|
|
86 void* allocate(int size)
|
|
87 {
|
|
88 void *buff = 0;
|
|
89 if (size==0) return 0;
|
|
90 #if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN)
|
|
91 buff = malloc(size);
|
|
92 #else
|
|
93 posix_memalign(&buff, DEFAULT_ALIGNMENT, size);
|
|
94 #endif
|
|
95 if (buff==0)
|
|
96 get_scheduler()->printf("Can't allocate memory\n");
|
|
97 return buff;
|
|
98 }
|
|
99
|
|
100 Scheduler* get_scheduler() { return scheduler; }
|
|
101 void set_scheduler(Scheduler *s) { scheduler = s; }
|
|
102 } __attribute__ ((aligned (DEFAULT_ALIGNMENT)));
|
|
103
|
|
104 #endif
|