3
|
1 #include "TaskManager.h"
|
14
|
2 #include "SymTable.h"
|
3
|
3
|
|
4 TaskManager::TaskManager(int num)
|
|
5 {
|
|
6 machineNum = num;
|
|
7 }
|
|
8
|
|
9 /**
|
|
10 * create_impl(int);
|
|
11 *
|
|
12 * [cell版] ../../Cell/SpeTaskManagerImpl.cpp
|
|
13 * [fifo版] ../../Fifo/FifoTaskManagerImpl.cpp
|
|
14 * で定義されています。コンパイル時に
|
|
15 *
|
|
16 * % make cell ってすると cell 版が、
|
|
17 * % make fifo ってすると fifo 版 がリンクされるようにしているので
|
|
18 * それに応じて create_impl が返す値を変えています。
|
|
19 * cell だったら SpeManagerImpl, fifo だったら FifoManagerImpl です。
|
|
20 *
|
|
21 * 今までは ifdef CELL とか書いてましたわ。どっちがいいかね
|
|
22 *
|
|
23 * てか、普通に TaskManagerImpl に関数持たせた方が早いか・・・?
|
|
24 */
|
|
25 extern TaskManagerImpl* create_impl(int);
|
|
26
|
|
27 void
|
|
28 TaskManager::init(void)
|
|
29 {
|
|
30 m_impl = create_impl(machineNum);
|
|
31 m_impl->init();
|
14
|
32
|
|
33 symtb = new SymTable;
|
|
34 symtb->init();
|
3
|
35 }
|
|
36
|
20
|
37 void
|
|
38 TaskManager::finish(void)
|
|
39 {
|
|
40 delete m_impl;
|
|
41 delete symtb;
|
|
42 }
|
|
43
|
3
|
44 /**
|
|
45 * @param command Task executes method number
|
|
46 * @param in_size Size of data
|
|
47 * @param in_addr Input address of data
|
|
48 * @param out_addr Output address of data
|
|
49 * @param func When this task ends, func execute.
|
|
50 *
|
|
51 * @return this task
|
|
52 */
|
|
53
|
|
54 HTaskPtr
|
|
55 TaskManager::create_task(int cmd, int size, unsigned long long in_addr,
|
|
56 unsigned long long out_addr, void (*func)(void))
|
|
57 {
|
|
58 return m_impl->create_task(cmd, size, in_addr, out_addr, func);
|
|
59 }
|
|
60
|
|
61 void
|
|
62 TaskManager::set_task_depend(HTaskPtr master, HTaskPtr slave)
|
|
63 {
|
|
64 m_impl->set_task_depend(master, slave);
|
|
65 }
|
|
66
|
|
67 void
|
18
|
68 TaskManager::spawn_task(HTaskPtr task)
|
3
|
69 {
|
18
|
70 m_impl->spawn_task(task);
|
3
|
71 }
|
|
72
|
|
73 void
|
|
74 TaskManager::run(void)
|
|
75 {
|
|
76 m_impl->run();
|
|
77 }
|
14
|
78
|
|
79 /**
|
|
80 * initialize task だから(?)、
|
|
81 * read/write/post/func はなしって最初から決めうちだけど
|
|
82 * いいのかな。いいのか?
|
|
83 */
|
|
84 void
|
|
85 TaskManager::set_init_task(const char *sym)
|
|
86 {
|
|
87 HTaskPtr init;
|
|
88 int init_fd;
|
|
89
|
|
90 init_fd = open(sym);
|
|
91 init = m_impl->create_task(init_fd, 0, 0, 0, 0);
|
18
|
92 spawn_task(init);
|
14
|
93 }
|
|
94
|
|
95
|
|
96
|
|
97 // ここは、バイナリから自動的に読めるとうれしいけど
|
|
98 // どうやるんだろうね。ユーザに追加させるのはめんどくさい
|
|
99 void
|
|
100 TaskManager::set_symbol(const char *sym, void *addr)
|
|
101 {
|
|
102 symtb->set_symbol(sym, addr);
|
|
103 }
|
|
104
|
|
105 /**
|
|
106 * open というか、今は topen (task open) ? 違うな
|
|
107 */
|
|
108 int
|
|
109 TaskManager::open(const char *sym)
|
|
110 {
|
|
111 return symtb->get_fd(sym);
|
|
112 }
|
|
113
|
|
114 void*
|
|
115 TaskManager::get_address(int fd)
|
|
116 {
|
|
117 return symtb->get_address(fd);
|
|
118 }
|