Mercurial > hg > Members > kono > Cerium
view TaskManager/kernel/ppe/TaskManager.cc @ 370:4435c9990988
change TaskManger & memory/* & Random
author | aaa |
---|---|
date | Wed, 29 Jul 2009 15:09:36 +0900 |
parents | 03ae2929c931 |
children | eab18aa0c7f6 |
line wrap: on
line source
#include "TaskManager.h" TaskManager::TaskManager(int num) : machineNum(num) { gen_random = new Random; } TaskManager::~TaskManager(void) { delete m_impl; delete gen_random; } /** * create_impl(int); * * [cell版] ../../Cell/CellTaskManagerImpl.cpp * [fifo版] ../../Fifo/FifoTaskManagerImpl.cpp * で定義されています。コンパイル時に * * % make cell ってすると cell 版が、 * % make fifo ってすると fifo 版 がリンクされるようにしているので * それに応じて create_impl が返す値を変えています。 * cell だったら CellManagerImpl, fifo だったら FifoManagerImpl です。 * * 今までは ifdef CELL とか書いてましたわ。どっちがいいかね * * てか、普通に TaskManagerImpl に関数持たせた方が早いか・・・? */ extern TaskManagerImpl* create_impl(int); void TaskManager::init(void) { m_impl = create_impl(machineNum); m_impl->init(); m_impl->systask_init(); } void TaskManager::finish(void) { delete m_impl; } /** * @param [command] Task executes method number * * @return this task */ HTaskPtr TaskManager::create_task(int cmd) { return m_impl->create_task(cmd); } /** * TaskManaer 終了時に実行される関数の設定 */ void TaskManager::set_TMend(void (*endf)(void)) { tm_end = endf; } void TaskManager::run(void) { m_impl->run(); } void* TaskManager::allocate(int size) { return m_impl->allocate(size); } int TaskManager::get_cpuNum(void) { return machineNum; } int TaskManager::get_random(void) { return gen_random->getData(); } /*! @param [size] リストの要素1つのサイズ @param [count] 要素数 @return allocate した領域のポインタ */ MemList* TaskManager::createMemList(uint32 size, uint32 count) { uint32 head_size = round_up16(sizeof(MemorySegment)); uint32 seg_size = round_up16(head_size+size); char* mseg = (char*)m_impl->allocate(seg_size*count); MemList* mlist = new MemList((MemorySegment*)mseg); for(uint32 i = 0; i < count; i++) { MemorySegment* next = (MemorySegment*)(mseg+seg_size*i); char* data = (char*)next+head_size; next->data = (void*)data; mlist->addLast(next); } return mlist; }