enum { Maxsteps = 200 * 100 * 2, /* 100 periods of 200 procs */ /* Edf.flags field */ Admitted = 0x01, Sporadic = 0x02, Yieldonblock = 0x04, Sendnotes = 0x08, Deadline = 0x10, Yield = 0x20, Extratime = 0x40, Infinity = ~0ULL, }; typedef struct Edf Edf; struct Edf { /* All times in µs */ /* time intervals */ long D; /* Deadline */ long Delta; /* Inherited deadline */ long T; /* period */ long C; /* Cost */ long S; /* Slice: time remaining in this period */ /* times (only low-order bits of absolute time) */ long r; /* (this) release time */ long d; /* (this) deadline */ long t; /* Start of next period, t += T at release */ long s; /* Time at which this proc was last scheduled */ /* for schedulability testing */ long testDelta; int testtype; /* Release or Deadline */ long testtime; Proc *testnext; /* other */ ushort flags; Timer; /* Stats */ long edfused; long extraused; long aged; ulong periods; ulong missed; }; extern Lock edftestlock; /* for atomic admitting/expelling */ #pragma varargck type "t" long #pragma varargck type "U" uvlong /* Interface: */ Edf* edflock(Proc*); void edfunlock(void);