view TaskManager/Cell/CellTaskManagerImpl.cc @ 73:811ffebd8deb

*** empty log message ***
author gongo
date Mon, 18 Feb 2008 03:34:35 +0900
parents 178459e03f5c
children 5a1a5f4c28fd
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->activeTaskQueue);

    if (list == NULL) {
	next_list = set_task();
	d = mailManager->create((unsigned int)next_list);
	list = MailManager::append_mailQueue(list, d);
    }

    return list;
}


TaskManagerImpl*
create_impl(int num)
{
    return new CellTaskManagerImpl(num);
}