Mercurial > hg > Game > Cerium
view TaskManager/Fifo/FifoTaskManagerImpl.cc @ 22:b7e6899ebb3b
*** empty log message ***
author | gongo |
---|---|
date | Sun, 10 Feb 2008 16:51:20 +0900 |
parents | 31a7ff27ee20 |
children | aa11038dbdc1 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "FifoTaskManagerImpl.h" #include "ppe_spe.h" FifoTaskManagerImpl::~FifoTaskManagerImpl(void) { delete taskInfo; delete mailManager; } void FifoTaskManagerImpl::init(void) { taskInfo = new FifoTaskInfo(); taskInfo->init(); mailManager = new MailManager(); mailManager->init_pool_mailQueue(20); } TaskListPtr FifoTaskManagerImpl::set_task(void) { // ここ...直すかな TaskListPtr list; TaskQueuePtr queue; TaskQueuePtr d; HTaskPtr htask; TaskPtr task; queue = taskInfo->activeTaskQueue; if (queue == NULL) { return NULL; } taskInfo->clear_taskList(); while (queue) { list = taskInfo->get_available_taskList(); htask = queue->task; d = queue; queue = queue->next; task = &list->tasks[list->length++]; task->command = htask->command; task->in_addr = htask->in_addr; task->out_addr = htask->out_addr; task->in_size = htask->in_size; task->self = htask; taskInfo->free_taskQueue(d); } taskInfo->activeTaskQueue = NULL; return list; } void FifoTaskManagerImpl::spawn_task(HTaskPtr task) { TaskManagerImpl::spawn_task(task); //run(); } // ../spe/main.cpp extern MailQueuePtr spe_main(MailManager*, MailQueuePtr); /** * spe 側は MY_SPE_COMMAND_EXIT を受け取るまでは別スレッドで動き続ける。 * fifo version では sequential に動かすため、 * mail list の最後に番兵として MY_SPE_COMMAND_EXIT のメールを入れる。 * これで、fifo での spe 側は、mail で受け取った task_list を処理した後 * EXIT を受け取って終了する・・・といいな */ void FifoTaskManagerImpl::run(void) { TaskListPtr list; MailQueuePtr mail_list = NULL; MailQueuePtr list_mail = NULL; // task list MailQueuePtr sentinel = NULL; // 番兵 // 暫定 list = set_task(); list_mail = mailManager->create_mail((unsigned int)list); mail_list = append_mailQueue(mail_list, list_mail); do { sentinel = mailManager->create_mail(MY_SPE_COMMAND_EXIT); mail_list = append_mailQueue(mail_list, sentinel); // 返って来た mail_list には、spe からの mail がある mail_list = spe_main(mailManager, mail_list); mail_list = mail_check(mail_list); } while (mail_list); } MailQueuePtr FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list) { MailQueuePtr q = mail_list; MailQueuePtr d; MailQueuePtr ret = NULL; unsigned int data; TaskListPtr next_list; while (q) { data = q->data; if (data == MY_SPE_STATUS_READY) { #ifdef _PPE_DEBUG printf("[FIFO] finish\n"); #endif next_list = set_task(); if (next_list != NULL) { d = mailManager->create_mail((unsigned int)next_list); ret = append_mailQueue(ret, d); } } else { #ifdef _PPE_DEBUG printf("[PPE] recv from : 0x%x\n", data); #endif taskInfo->check_task_finish((HTaskPtr)data); } d = q; q = q->next; mailManager->free_mailQueue(d); } return ret; } TaskManagerImpl* create_impl(int num) { return new FifoTaskManagerImpl(); }