edf.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. enum {
  2. Nproc = 8,
  3. Nres = 8,
  4. Ntask = 8,
  5. Maxtasks = 20,
  6. Maxresources = 20,
  7. Maxsteps = Maxtasks * 2 * 100, /* 100 periods of maximum # of tasks */
  8. /* Edf.flags field */
  9. Verbose = 0x1,
  10. Useblocking = 0x2,
  11. Infinity = 0xffffffffffffffffULL,
  12. };
  13. enum Edfstate {
  14. EdfUnused, /* task structure not in use */
  15. EdfExpelled, /* in initialization, not yet admitted */
  16. EdfAdmitted, /* admitted, but not started */
  17. EdfIdle, /* admitted, but no member processes */
  18. EdfAwaitrelease, /* released, but too early (on qwaitrelease) */
  19. EdfReleased, /* released, but not yet scheduled (on qreleased) */
  20. EdfRunning, /* one of this task's procs is running (on stack) */
  21. EdfExtra, /* one of this task's procs is running in extra time (off stack) */
  22. EdfPreempted, /* the running proc was preempted */
  23. EdfBlocked, /* none of the procs are runnable as a result of sleeping */
  24. EdfDeadline, /* none of the procs are runnable as a result of scheduling */
  25. };
  26. typedef enum Edfstate Edfstate;
  27. typedef struct Edf Edf;
  28. typedef struct Head Head;
  29. typedef struct List List;
  30. typedef struct Resource Resource;
  31. typedef struct Task Task;
  32. typedef struct Taskq Taskq;
  33. typedef struct CSN CSN;
  34. typedef struct TaskLink TaskLink;
  35. struct List {
  36. List * next; /* next in list */
  37. void * i; /* item in list */
  38. };
  39. struct Head {
  40. List *next; /* First item in list */
  41. int n; /* number of items in list */
  42. };
  43. struct Edf {
  44. /* time intervals */
  45. Ticks D; /* Deadline */
  46. Ticks Delta; /* Inherited deadline */
  47. Ticks T; /* period */
  48. Ticks C; /* Cost */
  49. Ticks S; /* Slice: time remaining in this period */
  50. /* times */
  51. Ticks r; /* (this) release time */
  52. Ticks d; /* (this) deadline */
  53. Ticks t; /* Start of next period, t += T at release */
  54. /* for schedulability testing */
  55. Ticks testDelta;
  56. int testtype; /* Release or Deadline */
  57. Ticks testtime;
  58. Task * testnext;
  59. /* statistics gathering */
  60. ulong periods; /* number of periods */
  61. ulong missed; /* number of deadlines missed */
  62. ulong preemptions;
  63. Ticks total; /* total time used */
  64. Ticks aged; /* aged time used */
  65. /* other */
  66. Edfstate state;
  67. };
  68. struct Task {
  69. QLock;
  70. Ref; /* ref count for farbage collection */
  71. int taskno; /* task number in Qid */
  72. Edf;
  73. Ticks scheduled;
  74. Schedq runq; /* Queue of runnable member procs */
  75. Head procs; /* List of member procs */
  76. Head csns; /* List of resources */
  77. CSN *curcsn; /* Position in CSN tree or nil */
  78. char *user; /* mallocated */
  79. Dirtab dir;
  80. int flags; /* e.g., Verbose */
  81. Task *rnext;
  82. };
  83. struct Taskq
  84. {
  85. Lock;
  86. Task* head;
  87. int (*before)(Task*, Task*); /* ordering function for queue (nil: fifo) */
  88. };
  89. struct Resource
  90. {
  91. Ref;
  92. char * name;
  93. Head tasks;
  94. Ticks Delta;
  95. /* for schedulability testing */
  96. Ticks testDelta;
  97. };
  98. struct CSN {
  99. List; /* links and identifies the resource (must be first) */
  100. Task *t; /* task the CSN belongs to */
  101. Ticks C; /* cost */
  102. int R; /* read-only access (as opposed to exclusive access) */
  103. Ticks Delta; /* of the Tasks critical section */
  104. Ticks testDelta;
  105. Ticks S; /* Remaining slice */
  106. CSN* p; /* parent resource items */
  107. };
  108. struct TaskLink {
  109. List; /* links and identifies the task (must be first) */
  110. Ticks C; /* cost */
  111. int R; /* read-only access (as opposed to exclusive access) */
  112. };
  113. extern QLock edfschedlock;
  114. extern Head tasks;
  115. extern Head resources;
  116. extern int nresources;
  117. extern Lock edflock;
  118. extern Taskq qwaitrelease;
  119. extern Taskq qreleased;
  120. extern Taskq qextratime;
  121. extern Taskq edfstack[];
  122. extern int edfstateupdate;
  123. extern void (*devrt)(Task *, Ticks, int);
  124. extern char * edfstatename[];
  125. #pragma varargck type "T" Time
  126. #pragma varargck type "U" Ticks
  127. Time ticks2time(Ticks);
  128. Ticks time2ticks(Time);
  129. int putlist(Head*, List*);
  130. int enlist(Head*, void*);
  131. int delist(Head*, void*);
  132. char * parsetime(Time*, char*);
  133. void * findlist(Head*, void*);
  134. Task * findtask(int);
  135. List * onlist(Head*, void*);
  136. int timeconv(Fmt*);
  137. void resourcefree(Resource*);
  138. Resource* resource(char*, int);
  139. void removetask(Task*);
  140. void taskfree(Task*);
  141. char * parseresource(Head*, CSN*, char*);
  142. char * seprintresources(char*, char*);
  143. char * seprintcsn(char*, char*, Head*);
  144. void resourcetimes(Task*, Head*);
  145. char* dumpq(char*, char*, Taskq*, Ticks);
  146. char* seprinttask(char*, char*, Task*, Ticks);
  147. char* dumpq(char*, char*, Taskq*, Ticks);
  148. #define DEBUG if(1){}else iprint