view TaskManager/kernel/schedule/SchedTask.h @ 643:bffdede05f1e

minor fix.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Nov 2009 10:57:37 +0900
parents 0692b08f1cd6
children 3b6290c05f9f
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"

#ifdef SIMPLE_TASK
#define Task SimpleTask
#define TaskPtr SimpleTaskPtr
#endif

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;
#ifndef SIMPLE_TASK
    memaddr *param;
#endif

    /**
     * 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 ---
#ifdef SIMPLE_TASK
    int read_size() { return task->r_size; }
    int write_size() { return task->w_size; }
    void set_write_size(int w) { task->w_size = w; }
#else
    void* get_input(void *buff, int index);
    void* get_output(void *buff, int index);
    memaddr get_inputAddr(int index);
    memaddr get_outputAddr(int index);
    // 書き出しを追加する API がない... 
    int get_inputSize(int index);
    int get_outputSize(int index);
    memaddr get_param(int index);
#endif

    int get_cpuid();

    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();
    memaddr 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, memaddr addr, uint32 size, uint32 mask);
    void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask);
    void dma_wait(uint32 mask);
    void show_dma_wait();

    /*!
      SPU用の get_input, get_output
     */
#ifndef SIMPLE_TASK
    void* get_input(int index) {
      return get_input(readbuf, index);
    }

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

    // user
    HTaskPtr create_task(int cmd);
    HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws);

    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, ...);

};


extern SchedTask* createSchedTask(Scheduler *,TaskPtr);


#endif