view TaskManager/kernel/schedule/SchedTask.h @ 619:0decff4e867b

RenewTask removal
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 15 Nov 2009 02:02:30 +0900
parents 47b61865ea8c
children 60aa3f241b10
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 "HTask.h"
#include "MemList.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;

    /* functions */

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

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

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


public:
    /* functions */

    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* 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);
    }

    // user
    HTaskPtr create_task(int cmd);
    void set_task_depend(HTaskPtr master, HTaskPtr slave);
    void spawn_task(HTaskPtr);
    void set_task_cpu(HTaskPtr, CPU_TYPE);
    void* allocate(int size,int align);
    Scheduler* get_scheduler();

    /* 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