view TaskManager/kernel/spe/SpeManager.cc @ 3:2356238ebea7

*** empty log message ***
author gongo
date Tue, 05 Feb 2008 20:22:50 +0900
parents
children 39ce245235d4
line wrap: on
line source

#include <stdio.h>

// 絶対 Fix me
// memalign のためにこんなことに・・・
// ここもオブジェクトでやるべきだよなー
#ifdef CELL
#  include <malloc.h>
#else
#  include <stdlib.h>
#  include <string.h>
#endif

#include "SpeManager.h"
#include "SpeNop.h"
#include "error.h"

SpeManager::SpeManager(void)
{
}

void
SpeManager::init(void)
{
    int i;

    /**
     * memalign だと、なぜか同じアドレスしか帰ってこないあげく
     * task3->exec のところで、 _start に飛んで最初からになって
     * だけどループしなくて止まるとかよくわからん
     *
     * new すりゃあ大丈夫っぽい。が、アライメント云々で
     * 最悪でも readBuf や writeBuf は memalign でしたいんだけどどうして?
     *
     * 追記
     * アライメントを128じゃなくて16にしたら通った。
     * ppe側も128にしてるんだけどなー
     * 128にしたせいで、どっかサイズずれた?
     */

    for (i = 0; i < 2; i++) {
#ifdef CELL
	listBuf[i]  =
	    (TaskListPtr)memalign(DEFAULT_ALIGNMENT, sizeof(TaskList));
	readBuf[i]  = memalign(DEFAULT_ALIGNMENT, 4*1024);
	writeBuf[i] = memalign(DEFAULT_ALIGNMENT, 4*1024);
#else
	listBuf[i] = new TaskList;
	readBuf[i] = malloc(4*1024);
	writeBuf[i] = malloc(4*1024);
#endif
    }

    listBufFlg = 0;
    readBufFlg = 0;
    writeBufFlg = 0;

    task1 = new SpeNop();
    task2 = new SpeNop();
    task3 = new SpeNop();
}

void
SpeManager::set_connect(DmaManager* cn)
{
    connector = cn;
}

void
SpeManager::run(void)
{
    SpeTaskBase* taskTmp;

    // main loop
    do {
	__debug("----------");
	task3->write();
	task2->exec();
	task1->read();

	taskTmp = task3;
	task3 = task2;
	task2 = task1;
	task1 = task1->next(this, taskTmp);
    } while (task1);

    delete task3;
    delete task2;
}

void
SpeManager::finish(void)
{
    int i;

    for (i = 0; i < 2; i++) {
#ifdef CELL
	free(listBuf[i]);
#else
	delete listBuf[i];
#endif
	free(readBuf[i]);
	free(writeBuf[i]);
    }
}

TaskListPtr
SpeManager::get_curListBuf(void)
{
    listBufFlg ^= 1;
    return listBuf[listBufFlg];
}

void*
SpeManager::get_curReadBuf(void)
{
    readBufFlg ^= 1;
    return readBuf[readBufFlg];
}

void*
SpeManager::get_curWriteBuf(void)
{
    writeBufFlg ^= 1;
    return writeBuf[writeBufFlg];
}