Mercurial > hg > Members > kono > Cerium
view TaskManager/kernel/ppe/TaskManager.cc @ 47:8266445bdac2
*** empty log message ***
author | gongo |
---|---|
date | Fri, 15 Feb 2008 13:09:58 +0900 |
parents | f154d9d07a42 |
children | 7927e00fb8e2 |
line wrap: on
line source
#include "TaskManager.h" #include "SymTable.h" TaskManager::TaskManager(int num) { machineNum = num; } /** * create_impl(int); * * [cell版] ../../Cell/SpeTaskManagerImpl.cpp * [fifo版] ../../Fifo/FifoTaskManagerImpl.cpp * で定義されています。コンパイル時に * * % make cell ってすると cell 版が、 * % make fifo ってすると fifo 版 がリンクされるようにしているので * それに応じて create_impl が返す値を変えています。 * cell だったら SpeManagerImpl, fifo だったら FifoManagerImpl です。 * * 今までは ifdef CELL とか書いてましたわ。どっちがいいかね * * てか、普通に TaskManagerImpl に関数持たせた方が早いか・・・? */ extern TaskManagerImpl* create_impl(int); void TaskManager::init(void) { m_impl = create_impl(machineNum); m_impl->init(); symtb = new SymTable; symtb->init(); } void TaskManager::finish(void) { delete m_impl; delete symtb; } /** * @param command Task executes method number * @param in_size Size of data * @param in_addr Input address of data * @param out_addr Output address of data * @param func When this task ends, func execute. * * @return this task */ HTaskPtr TaskManager::create_task(int cmd, int size, unsigned long long in_addr, unsigned long long out_addr, void (*func)(void)) { return m_impl->create_task(cmd, size, in_addr, out_addr, func); } void TaskManager::set_task_depend(HTaskPtr master, HTaskPtr slave) { m_impl->set_task_depend(master, slave); } void TaskManager::spawn_task(HTaskPtr task) { m_impl->spawn_task(task); } void TaskManager::run(void) { m_impl->run(); } /** * initialize task だから(?)、 * read/write/post/func はなしって最初から決めうちだけど * いいのかな。いいのか? */ void TaskManager::set_init_task(const char *sym) { HTaskPtr init; int init_fd; init_fd = open(sym); init = m_impl->create_task(init_fd, 0, 0, 0, 0); spawn_task(init); } // ここは、バイナリから自動的に読めるとうれしいけど // どうやるんだろうね。ユーザに追加させるのはめんどくさい void TaskManager::set_symbol(const char *sym, void *addr) { symtb->set_symbol(sym, addr); } /** * open というか、今は topen (task open) ? 違うな */ int TaskManager::open(const char *sym) { return symtb->get_fd(sym); } void* TaskManager::get_address(int fd) { return symtb->get_address(fd); }