view TaskManager/Fifo/FifoTaskManagerImpl.cc @ 14:41ccd4b38184

*** empty log message ***
author gongo
date Fri, 08 Feb 2008 18:00:21 +0900
parents 7aa4c006e4be
children 0c9341da4522
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "FifoTaskManagerImpl.h"
#include "ppe_spe.h"

void
FifoTaskManagerImpl::init(void)
{
    taskInfo = new FifoTaskInfo();
    taskInfo->init();

    mailManager = new MailManager();
    mailManager->init_pool_mailQueue(20);
}

TaskListPtr
FifoTaskManagerImpl::set_task(void)
{
    // ここ...直すかな
    TaskListPtr list = taskInfo->machineTaskList[0];
    TaskQueuePtr queue = taskInfo->activeTaskQueue;
    TaskQueuePtr d;
    HTaskPtr htask;
    TaskPtr task;

    if (queue == NULL) {
	return NULL;
    }

    // Fixme
    // ここは、clear_taskList とか?
    list->length = 0;

    while (queue) {
	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::run_task(HTaskPtr task)
{
    TaskManagerImpl::run_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();
}