view TaskManager/kernel/schedule/SchedTaskArray.cc @ 695:cbcf0182635e

TaskArray on going...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 12 Dec 2009 17:38:30 +0900
parents
children b5c3ef336878
line wrap: on
line source

#include "SchedTaskArray.h"
#include "SchedTask.h"

extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT];

SchedTaskArray::SchedTaskArray(SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
{
    savedTask = savedTask_;
    task = curTask_;
    array = _array;
}

/**
 * dma_store の wait を行う
 */
SchedTaskArray::~SchedTaskArray()
{
}

void
SchedTaskArray::read()
{
    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);

    // object creation をSchedTaskArray生成時にやらないので、
    // exec の直前のread で十分に間に合う
    loadSchedTask(scheduler, task);

    // 読むデータが一つもなければ無視
    if (task->inData_size == 0) return;

    // load Input Data
    readbuf = scheduler->allocate(task->inListData()->size);
    scheduler->dma_loadList(task->inListData(), readbuf, DMA_READ);

}


void
SchedTaskArray::exec()
{
    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);

    scheduler->dma_wait(DMA_READ);
    task_list[task->command].wait(scheduler,task->command);
    task_list[task->command].run(this, readbuf, writebuf);
    free(readbuf);
    // 書き込む領域がなければ無視
    if (task->outData_size > 0) {
	writebuf = scheduler->allocate(task->outListData()->size);
        scheduler->dma_storeList(task->outListData(), writebuf, DMA_WRITE);
    }
}

void
SchedTaskArray::write()
{
    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);

    scheduler->dma_wait(DMA_WRITE);
    free(writebuf);

    // このTaskArrayは終り。終了を知らせる。
    if (task->next() >= last()) {
	scheduler->mail_write((memaddr)savedTask->task->self);
	free(array);
    }

}

Task *SchedTaskArray::last()
{
   return  (Task*)(((char*)array)+ savedTask->read_size());
}

SchedTaskBase*
SchedTaskArray::next(Scheduler *scheduler, SchedTaskArrayBase *p)
{
    __debug("[SchedTaskArray:%s]\n", __FUNCTION__);


    if (task->next() < last()) {
	// Task List が残っているので、次を準備
	return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array);
    } else {
	// このTaskArrayは終り。save していた Task の次を返す。
	// savedTask の read/exec は実行されない (command = TaskArray)
	return savedTask->next();
    }
}



/* end */