Mercurial > hg > Game > Cerium
comparison TaskManager/Cell/spe/SchedTask.cc @ 81:b03a4d3565c0
*** empty log message ***
author | gongo |
---|---|
date | Wed, 20 Feb 2008 17:07:11 +0900 |
parents | |
children | 504899860e66 |
comparison
equal
deleted
inserted
replaced
80:1c648675c2bd | 81:b03a4d3565c0 |
---|---|
1 #include "SchedTask.h" | |
2 #include "SchedTaskList.h" | |
3 #include "SchedNop2Ready.h" | |
4 #include "DmaManager.h" | |
5 #include "error.h" | |
6 #include "TaskManager.h" | |
7 | |
8 //extern int (*func_list[16])(void*, void*); | |
9 | |
10 SchedTask::SchedTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf, | |
11 DmaManager* cn) | |
12 { | |
13 list = _list; | |
14 task = _task; | |
15 readbuf = rbuf; | |
16 writebuf = wbuf; | |
17 connector = cn; | |
18 } | |
19 | |
20 void | |
21 SchedTask::read(void) | |
22 { | |
23 __debug("[SchedTask:%s]\n", __FUNCTION__); | |
24 | |
25 //task = &list->tasks[--list->length]; | |
26 connector->dma_load(readbuf, task->in_addr, task->in_size, DMA_READ); | |
27 } | |
28 | |
29 void | |
30 SchedTask::exec(void) | |
31 { | |
32 __debug("[SchedTask:%s]\n", __FUNCTION__); | |
33 | |
34 connector->dma_wait(DMA_READ); | |
35 | |
36 __debug(" task->command = %d\n", task->command); | |
37 __debug(" task->in_size = %d\n", task->in_size); | |
38 __debug(" task->in_addr = 0x%x\n", task->in_addr); | |
39 __debug(" task->out_addr = 0x%x\n", task->out_addr); | |
40 __debug(" list->next = 0x%x\n", (unsigned int)list->next); | |
41 __debug(" list->length = 0x%x\n", (unsigned int)list->length); | |
42 | |
43 //task->in_size = func_list[task->command](readbuf, writebuf); | |
44 task->in_size = run(readbuf, writebuf); | |
45 connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE); | |
46 } | |
47 | |
48 void | |
49 SchedTask::write(void) | |
50 { | |
51 __debug("[SchedTask:%s]\n", __FUNCTION__); | |
52 | |
53 connector->dma_wait(DMA_WRITE); | |
54 connector->mail_write((unsigned int)task->self); | |
55 } | |
56 | |
57 SchedTaskBase* | |
58 SchedTask::next(Scheduler *m, SchedTaskBase *p) | |
59 { | |
60 __debug("[SchedTask:%s]\n", __FUNCTION__); | |
61 | |
62 delete p; | |
63 | |
64 // ここ直さねば。どうやって if 文消そう? | |
65 // オブジェクト増やせばいいのかな | |
66 if (list->length == 0) { | |
67 if (list->next == 0) { | |
68 return new SchedNop2Ready(connector); | |
69 } else { | |
70 return new SchedTaskList((unsigned int)list->next, | |
71 m->get_curListBuf(), connector); | |
72 } | |
73 } else { | |
74 //return new SchedTask(list, m->get_curReadBuf(), | |
75 //m->get_curWriteBuf(), connector); | |
76 | |
77 // 本当は、ここで task->command に対応する、 | |
78 // SchedTask を継承する class を作ればいい。。。はず | |
79 return new SchedTask(list, &list->tasks[--list->length], | |
80 m->get_curReadBuf(), m->get_curWriteBuf(), | |
81 connector); | |
82 } | |
83 } | |
84 | |
85 extern SchedTask* (*task_list[16])(TaskListPtr, TaskPtr, void*, void*, | |
86 DmaManager*); | |
87 | |
88 SchedTask* | |
89 CreateSchedTask(TaskListPtr taskList, void *readbuf, void *writebuf, | |
90 DmaManager* dma) | |
91 { | |
92 TaskPtr task = &taskList->tasks[--taskList->length]; | |
93 | |
94 return task_list[task->command](taskList, task, readbuf, writebuf, dma); | |
95 } |