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