## diffname port/edf.h 2002/0315 ## diff -e /dev/null /n/emeliedump/2002/0315/sys/src/9/port/edf.h 0a 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 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 Δ; /* 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 testΔ; 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 Δ; /* for schedulability testing */ Ticks testΔ; }; 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 edf_stateupdate; extern void (*devsched)(Task *, Ticks, int); extern char * edf_statename[]; #pragma varargck type "T" Time #pragma varargck type "U" Ticks /* Interface: */ void edf_preempt(Task*); /* Stop current task, administrate run time, leave on stack */ void edf_deadline(Proc*); /* Remove current task from edfstack, schedule its next release */ void edf_release(Task*); /* Release a task */ void edf_schedule(Task *); /* Run a released task: remove from qrelease, push onto edfstack */ char * edf_admit(Task*); void edf_expel(Task*); void edf_bury(Proc*); /* Proc dies, update Task membership */ void edf_sched(Task*); /* Figure out what to do with task (after a state change) */ int isedf(Proc*); /* Proc must be edf scheduled */ void edf_stop(Proc*); /* Just event generation; should probably be done differently */ int edf_anyready(void); void edf_ready(Proc*); Proc * edf_runproc(void); void edf_block(Proc*); /* Edf proc has blocked, do the admin */ void edf_init(void); int edf_waitlock(Lock*); void edf_releaselock(Lock*); Time ticks2time(Ticks); Ticks time2ticks(Time); . ## diffname port/edf.h 2002/0316 ## diff -e /n/emeliedump/2002/0315/sys/src/9/port/edf.h /n/emeliedump/2002/0316/sys/src/9/port/edf.h 100c extern void (*devrt)(Task *, Ticks, int); . 13a typedef vlong Time; . ## diffname port/edf.h 2002/0320 ## diff -e /n/emeliedump/2002/0316/sys/src/9/port/edf.h /n/emeliedump/2002/0320/sys/src/9/port/edf.h 87c Ticks testDelta; . 85c Ticks Delta; . 50c Ticks testDelta; . 41c Ticks Delta; /* Inherited deadline */ . ## diffname port/edf.h 2002/0410 ## diff -e /n/emeliedump/2002/0320/sys/src/9/port/edf.h /n/emeliedump/2002/0410/sys/src/9/port/edf.h 107,124d 102c extern char * edfstatename[]; . 100c extern int edfstateupdate; . ## diffname port/edf.h 2002/0503 ## diff -e /n/emeliedump/2002/0410/sys/src/9/port/edf.h /n/emeliedump/2002/0503/sys/src/9/port/edf.h 53a /* statistics gathering */ ulong periods; /* number of periods */ ulong missed; /* number of deadlines missed */ ulong preemptions; Ticks total; /* total time used */ Ticks aged; /* aged time used */ . ## diffname port/edf.h 2002/0704 ## diff -e /n/emeliedump/2002/0503/sys/src/9/port/edf.h /n/emeliedump/2002/0704/sys/src/9/port/edf.h 17,20c typedef struct Task Task; typedef struct Resource Resource; typedef struct Edf Edf; typedef struct Taskq Taskq; . ## diffname port/edf.h 2002/0830 ## diff -e /n/emeliedump/2002/0704/sys/src/9/port/edf.h /n/emeliedump/2002/0830/sys/src/9/port/edf.h 41c Ticks Delta; /* Inherited deadline */ . ## diffname port/edf.h 2002/0831 ## diff -e /n/emeliedump/2002/0830/sys/src/9/port/edf.h /n/emeliedump/2002/0831/sys/src/9/port/edf.h 114a int putlist(Head*, List*); int enlist(Head*, void*); int delist(Head*, void*); . 96,99c struct ResourceItem { List; /* links and identifies the resource (must be first) */ Ticks C; /* cost */ Head h; /* sub resource items */ }; extern QLock edfschedlock; extern Head tasks; extern Head resources; . 89,90c Head tasks; . 87a Ref; . 69,72c Head procs; /* List of member procs */ Head res; /* List of resources */ . 65a Ref; /* ref count for farbage collection */ int taskno; /* task number in Qid */ . 37a struct List { List * next; /* next in list */ void * i; /* item in list */ }; struct Head { List *next; /* First item in list */ int n; /* number of items in list */ }; . 20a typedef struct List List; typedef struct Head Head; . ## diffname port/edf.h 2002/0912 ## diff -e /n/emeliedump/2002/0831/sys/src/9/port/edf.h /n/emeliedump/2002/0912/sys/src/9/port/edf.h 110a int x; /* exclusive access (as opposed to shared-read access) */ . 46,47c List *next; /* First item in list */ int n; /* number of items in list */ . 41c List * next; /* next in list */ . 18a typedef struct ResourceItem ResourceItem; . 14,15c typedef vlong Time; typedef uvlong Ticks; . ## diffname port/edf.h 2002/1119 ## diff -e /n/emeliedump/2002/0912/sys/src/9/port/edf.h /n/emeliedump/2002/1119/sys/src/9/port/edf.h 136a char * parsetime(Time*, char*); void * findlist(Head*, void*); Task * findtask(int); List * onlist(Head*, void*); int timeconv(Fmt*); void resourcefree(Resource*); Resource* resource(char*, int); void removetask(Task*); void taskfree(Task*); char * parseresource(Head*, CSN*, char*); char * seprintresources(char*, char*); char * seprintcsn(char*, char*, Head*); void resourcetimes(Task*, Head*); char* dumpq(char*, char*, Taskq*, Ticks); char* seprinttask(char*, char*, Task*, Ticks); char* dumpq(char*, char*, Taskq*, Ticks); #define DEBUG if(1){}else iprint . 115a struct TaskLink { List; /* links and identifies the task (must be first) */ Ticks C; /* cost */ int R; /* read-only access (as opposed to exclusive access) */ }; . 109,113c struct CSN { List; /* links and identifies the resource (must be first) */ Task *t; /* task the CSN belongs to */ Ticks C; /* cost */ int R; /* read-only access (as opposed to exclusive access) */ Ticks Delta; /* of the Tasks critical section */ Ticks testDelta; Ticks S; /* Remaining slice */ CSN* p; /* parent resource items */ . 85c Head csns; /* List of resources */ CSN *curcsn; /* Position in CSN tree or nil */ . 40a typedef enum Edfstate Edfstate; typedef struct Edf Edf; typedef struct Head Head; typedef struct List List; typedef struct Resource Resource; typedef struct Task Task; typedef struct Taskq Taskq; typedef struct CSN CSN; typedef struct TaskLink TaskLink; . 39d 17,23c }; . 14,15c Infinity = 0xffffffffffffffffULL, . 12d