xref: /plan9/sys/src/9/port/edf.h (revision 2cca75a1b2b8c6083390679d69d5c50cf66d9a01)
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