Mercurial > hg > Game > Cerium
view TaskManager/kernel/spe/SpeManager.cc @ 6:39ce245235d4
*** empty log message ***
author | gongo |
---|---|
date | Wed, 06 Feb 2008 11:41:08 +0900 |
parents | 2356238ebea7 |
children | b7e6899ebb3b |
line wrap: on
line source
#include <stdio.h> #include <new> // 絶対 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]; }