view TaskManager/kernel/ppe/TaskManager.cc @ 18:0c9341da4522

*** empty log message ***
author gongo
date Sun, 10 Feb 2008 11:39:21 +0900
parents 41ccd4b38184
children 31a7ff27ee20
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();
}

/**
 * @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);
}