enum {
Nproc = 8,
Nres = 8,
Ntask = 8,
Maxtasks = 20,
Maxresources = 20,
Maxsteps = Maxtasks * 2 * 100, /* 100 periods of maximum # of tasks */
/* Edf.flags field */
Verbose = 0x1,
Useblocking = 0x2,
};
typedef vlong Time;
typedef uvlong Ticks;
typedef struct Task Task;
typedef struct Resource Resource;
typedef struct Edf Edf;
typedef struct Taskq Taskq;
enum Edfstate {
EdfUnused, /* task structure not in use */
EdfExpelled, /* in initialization, not yet admitted */
EdfAdmitted, /* admitted, but not started */
EdfIdle, /* admitted, but no member processes */
EdfAwaitrelease, /* released, but too early (on qwaitrelease) */
EdfReleased, /* released, but not yet scheduled (on qreleased) */
EdfRunning, /* one of this task's procs is running (on stack) */
EdfExtra, /* one of this task's procs is running in extra time (off stack) */
EdfPreempted, /* the running proc was preempted */
EdfBlocked, /* none of the procs are runnable as a result of sleeping */
EdfDeadline, /* none of the procs are runnable as a result of scheduling */
};
typedef enum Edfstate Edfstate;
struct Edf {
/* time intervals */
Ticks D; /* Deadline */
Ticks Delta; /* Inherited deadline */
Ticks T; /* period */
Ticks C; /* Cost */
Ticks S; /* Slice: time remaining in this period */
/* times */
Ticks r; /* (this) release time */
Ticks d; /* (this) deadline */
Ticks t; /* Start of next period, t += T at release */
/* for schedulability testing */
Ticks testDelta;
int testtype; /* Release or Deadline */
Ticks testtime;
Task * testnext;
/* other */
Edfstate state;
};
struct Task {
QLock;
Edf;
Ticks scheduled;
Schedq runq; /* Queue of runnable member procs */
Proc * procs[Nproc]; /* List of member procs; may contain holes */
int nproc; /* number of them */
Resource* res[Nres]; /* List of resources; may contain holes */
int nres; /* number of them */
char *user; /* mallocated */
Dirtab dir;
int flags; /* e.g., Verbose */
Task *rnext;
};
struct Taskq
{
Lock;
Task* head;
int (*before)(Task*, Task*); /* ordering function for queue (nil: fifo) */
};
struct Resource
{
char * name;
Task * tasks[Ntask]; /* may contain holes */
int ntasks;
Ticks Delta;
/* for schedulability testing */
Ticks testDelta;
};
extern Lock edftestlock; /* for atomic admitting/expelling */
extern Task tasks[Maxtasks]; /* may contain holes */
extern int ntasks;
extern Resource resources[Maxresources]; /* may contain holes */
extern int nresources;
extern Lock edflock;
extern Taskq qwaitrelease;
extern Taskq qreleased;
extern Taskq qextratime;
extern Taskq edfstack[];
extern int edfstateupdate;
extern void (*devrt)(Task *, Ticks, int);
extern char * edfstatename[];
#pragma varargck type "T" Time
#pragma varargck type "U" Ticks
Time ticks2time(Ticks);
Ticks time2ticks(Time);