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 }