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;
}