Mercurial > hg > Members > kono > Cerium
view TaskManager/Cell/CellTaskManagerImpl.cc @ 76:5a1a5f4c28fd
*** empty log message ***
author | gongo |
---|---|
date | Mon, 18 Feb 2008 11:40:11 +0900 |
parents | 811ffebd8deb |
children | 83b57e03d3ef |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "CellTaskManagerImpl.h" #include "CellBufferManager.h" #include "types.h" #include "error.h" CellTaskManagerImpl::CellTaskManagerImpl(int num) { machineNum = num; } void CellTaskManagerImpl::init(void) { TaskManagerImpl::init(); bufferManager = new CellBufferManager(); bufferManager->init(); speThreads = new SpeThreads(machineNum); speThreads->init(); } TaskListPtr CellTaskManagerImpl::set_task(void) { // ここ...直すかな TaskListPtr list; TaskQueuePtr queue; TaskQueuePtr d; HTaskPtr htask; TaskPtr task; queue = ((CellBufferManager*)bufferManager)->speActiveTaskQueue; if (queue == NULL) { //return NULL; goto FINISH; } ((CellBufferManager*)bufferManager)->clear_cellTaskList(); while (queue) { //list = bufferManager->get_available_taskList(); list = ((CellBufferManager*)bufferManager)->machineTaskList[0]; htask = queue->task; d = queue; queue = queue->next; task = &list->tasks[list->length++]; task->command = htask->command; // Fix me !!!!! // ださいというか動かないだろこれ。 // かっこいい class 判定がないものか。typeinfoだっけ? // in,out にあるのが DmaBuffer 以外だったら通信させない決まりにしたい if (htask->in_addr != 0) { htask->in_addr->get_buffer(&task->in_addr); } else { task->in_addr = 0; } if (htask->in_addr != 0) { htask->out_addr->get_buffer(&task->out_addr); } else { task->out_addr = 0; } task->in_size = htask->in_size; task->self = htask; bufferManager->free_taskQueue(d); } ((CellBufferManager*)bufferManager)->speActiveTaskQueue = NULL; speThreads->send_mail(0, (unsigned int *)(&((CellBufferManager*)bufferManager)->machineTaskList[0])); FINISH: return TaskManagerImpl::set_task(); } /** * mail_list は ppe 側の mail なので、変更せず渡す。 * その前に spe からのメールをチェックする */ MailQueuePtr CellTaskManagerImpl::mail_check(MailQueuePtr mail_list) { int id; int data; MailQueuePtr list, d; TaskListPtr next_list; list = TaskManagerImpl::mail_check(mail_list); do { for (id = 0; id < machineNum; id++) { while (1) { data = speThreads->get_mail(id); if (data < 0) break; // 名前あとでちゃんと決めよう => MY_SPE_... とかじゃなくて if (data == MY_SPE_STATUS_READY) { __debug_ppe("[SPE %d] finish\n", id); } else { __debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data); bufferManager->check_task_finish((HTaskPtr)data); } } } } while (list == NULL && bufferManager->waitTaskQueue && !bufferManager->activeTaskQueue); if (list == NULL) { next_list = set_task(); if (next_list != NULL) { d = mailManager->create((unsigned int)next_list); list = MailManager::append_mailQueue(list, d); } } return list; } TaskManagerImpl* create_impl(int num) { return new CellTaskManagerImpl(num); }