view TaskManager/kernel/schedule/SchedTask.h @ 518:125a72948e44

....
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 16 Oct 2009 17:57:17 +0900
parents 1d4a8a86f26b
children 5c76db2a07fa
line wrap: on
line source

#ifndef INCLUDED_SCHED_TASK
#define INCLUDED_SCHED_TASK

#include <stdio.h>
#include <stdlib.h>
#include "base.h"
#include "Scheduler.h"
#include "SchedTaskBase.h"
#include "ListData.h"
#include "TaskGroup.h"
#include "MemList.h"
#include "HTask.h"

class SchedTask : public SchedTaskBase {
public:
    /* constructor */
    SchedTask();
    virtual ~SchedTask();

    BASE_NEW_DELETE(SchedTask);

private:
    /* variables */

    // Task を実行するスケジューラ自身
    Scheduler *scheduler;
    
    // 現在スケジューラが実行している TaskList と、このタスクに対応する Task
    TaskListPtr list;
    TaskPtr task;

    // read/write 用の ListData
    ListDataPtr inListData;
    ListDataPtr outListData;

    /**
     * read データ、write 用のバッファ
     * readbuf には タスク登録時に設定した入力データが入っている。
     * writebuf にデータを描き込んでおくと、
     * タスク登録時に設定した出力先に書き込む
     */
    void *readbuf;
    void *writebuf;

    // Task の、Tasklist での位置。(task = &list[cur_index-1])
    int cur_index;

    // タスク内で生成されたタスクのグループ
    TaskGroup *taskGroup;

    // このタスク内で生成されたタスクの数
    int renew_flag;

    // このタスクが SPE 内で生成されたタスクか否か 1: Yes, 0: No
    int flag_renewTask;

    // タスクがメインメモリ側で生成されたものか、
    // SPE で生成されたものかによって、データの扱いが変わってくる。
    // そのために if (flag_renewTask) を連発するのはよくないので
    // 関数ポインタで持っておく
    void (SchedTask::*ex_init)();
    void (SchedTask::*ex_read)();
    void (SchedTask::*ex_exec)();
    void (SchedTask::*ex_write)();
    SchedTaskBase* (SchedTask::*ex_next)();

    /* functions */

    // override
    void read();
    void exec();
    void write();
    SchedTaskBase* next(Scheduler *, SchedTaskBase *);

    // タスクの処理は、task_list に登録された C の関数によっておこなう

    //---  System API ---
    SchedTask* get_nextTask(TaskListPtr list);

    /**
     * PPE で生成されたタスクに対する
     * init, read,exec,write,next の付属(?)処理
     */
    void ex_init_normal();
    void ex_read_normal();
    void ex_exec_normal();
    void ex_write_normal();
    SchedTaskBase* ex_next_normal();

    /**
     * SPE で生成されたタスクに対する
     * inti, ead,exec,write,next の付属(?)処理
     */
    void ex_init_renew();
    void ex_read_renew();
    void ex_exec_renew();
    void ex_write_renew();
    SchedTaskBase* ex_next_renew();

public:
    /* functions */

    void setRenew();
    void init(TaskListPtr _list, TaskPtr _task, int index,
                    // ListDataPtr rbuf, ListDataPtr wbuf, 
		    Scheduler* sc);

    //---  User API ---
    int get_cpuid();

    void* get_input(void *buff, int index);
    void* get_output(void *buff, int index);
    uint32 get_inputAddr(int index);
    uint32 get_outputAddr(int index);
    // 書き出しを追加する API がない... 
    int get_inputSize(int index);
    int get_outputSize(int index);
    int get_param(int index);

    void set_post(PostFunction func,void *read, void *write);

    TaskPtr create_task(int cmd);
    void wait_task(TaskPtr waitTask);

    void* global_alloc(int id, int size);
    void* global_get(int id);
    void global_set(int id, void *addr);
    void global_free(int id);
    MemList* createMemList(int size, int count);

    void mainMem_alloc(int id, int size);
    void mainMem_wait();
    void* mainMem_get(int id);

    MemorySegment * get_segment(memaddr addr, MemList *m);
    uint32 get_tag();
    void put_segment(MemorySegment *s);
    void wait_segment(MemorySegment *s);



    void *allocate(int size);
    void free_(void *p) {
	scheduler->free_(p);
    }

    /* これは禁止するべき */
    void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask);
    void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask);
    void dma_wait(uint32 mask);
    void show_dma_wait();

    /*!
      SPU用の get_input, get_output
     */

    void* get_input(int index) {
      return get_input(readbuf, index);
    }

    void* get_output(int index) {
      return get_output(writebuf, index);
    }

    /* system call */

    FILE *stdout_;
    FILE *stderr_;
    FILE *stdin_;
    int fprintf(FILE * stream, const char * format, ...);
    int printf(const char * format, ...);

};

const int SCHED_TASK_NORMAL = 0;
const int SCHED_TASK_RENEW  = 1;

extern SchedTask* createSchedTask(Scheduler *,TaskPtr);
extern void loadSchedTask(Scheduler *scheduler,TaskPtr task);


#endif