19a747e4fSDavid du Colombier enum { 2da51d93aSDavid du Colombier Maxsteps = 200 * 100 * 2, /* 100 periods of 200 procs */ 39a747e4fSDavid du Colombier 49a747e4fSDavid du Colombier /* Edf.flags field */ 5e288d156SDavid du Colombier Admitted = 0x01, 6e288d156SDavid du Colombier Sporadic = 0x02, 7e288d156SDavid du Colombier Yieldonblock = 0x04, 8e288d156SDavid du Colombier Sendnotes = 0x08, 9e288d156SDavid du Colombier Deadline = 0x10, 10e288d156SDavid du Colombier Yield = 0x20, 1137aecfafSDavid du Colombier Extratime = 0x40, 12d9306527SDavid du Colombier 13e288d156SDavid du Colombier Infinity = ~0ULL, 149a747e4fSDavid du Colombier }; 159a747e4fSDavid du Colombier 16d9306527SDavid du Colombier typedef struct Edf Edf; 173ff48bf5SDavid du Colombier 189a747e4fSDavid du Colombier struct Edf { 19*2cca75a1SDavid du Colombier /* All times in µs */ 209a747e4fSDavid du Colombier /* time intervals */ 21*2cca75a1SDavid du Colombier long D; /* Deadline */ 22*2cca75a1SDavid du Colombier long Delta; /* Inherited deadline */ 23*2cca75a1SDavid du Colombier long T; /* period */ 24*2cca75a1SDavid du Colombier long C; /* Cost */ 25*2cca75a1SDavid du Colombier long S; /* Slice: time remaining in this period */ 26*2cca75a1SDavid du Colombier /* times (only low-order bits of absolute time) */ 27*2cca75a1SDavid du Colombier long r; /* (this) release time */ 28*2cca75a1SDavid du Colombier long d; /* (this) deadline */ 29*2cca75a1SDavid du Colombier long t; /* Start of next period, t += T at release */ 30*2cca75a1SDavid du Colombier long s; /* Time at which this proc was last scheduled */ 319a747e4fSDavid du Colombier /* for schedulability testing */ 32*2cca75a1SDavid du Colombier long testDelta; 339a747e4fSDavid du Colombier int testtype; /* Release or Deadline */ 34*2cca75a1SDavid du Colombier long testtime; 35e288d156SDavid du Colombier Proc *testnext; 369a747e4fSDavid du Colombier /* other */ 37e288d156SDavid du Colombier ushort flags; 38c49c9d4eSDavid du Colombier Timer; 39e288d156SDavid du Colombier /* Stats */ 40*2cca75a1SDavid du Colombier long edfused; 41*2cca75a1SDavid du Colombier long extraused; 42*2cca75a1SDavid du Colombier long aged; 43e288d156SDavid du Colombier ulong periods; 44e288d156SDavid du Colombier ulong missed; 459a747e4fSDavid du Colombier }; 469a747e4fSDavid du Colombier 47e288d156SDavid du Colombier extern Lock edftestlock; /* for atomic admitting/expelling */ 489a747e4fSDavid du Colombier 49*2cca75a1SDavid du Colombier #pragma varargck type "t" long 50e288d156SDavid du Colombier #pragma varargck type "U" uvlong 519a747e4fSDavid du Colombier 52e288d156SDavid du Colombier /* Interface: */ 53da51d93aSDavid du Colombier Edf* edflock(Proc*); 54e288d156SDavid du Colombier void edfunlock(void); 55