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