edfproc.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "realtime.h"
  4. #include "time.h"
  5. char * T = "10s";
  6. char * D = "5s";
  7. char * C = "1.5s";
  8. char * S = nil;
  9. char * s = "250ms";
  10. char * R = "";
  11. int verbose, debug, tset, dset, cset, sset, besteffort;
  12. int nproc = 1;
  13. uvlong v;
  14. char *clonedev = "#R/realtime/clone";
  15. char missstr[] = "sys: deadline miss: runtime";
  16. int notefd;
  17. int
  18. rthandler(void*, char *s)
  19. {
  20. static int umpteenth;
  21. if (!umpteenth++)
  22. fprint(2, "note received: %s\n", s);
  23. if (strncmp(missstr, s, strlen(missstr)) == 0)
  24. return 1;
  25. /* On any other note */
  26. if (fprint(notefd, "remove") < 0)
  27. sysfatal("Could not remove task: %r");
  28. sysfatal("Removed task");
  29. return 1;
  30. }
  31. static int
  32. schedpars(char *period, char *deadline, char *cost)
  33. {
  34. int fd;
  35. if ((fd = open(clonedev, ORDWR)) < 0)
  36. sysfatal("%s: %r", clonedev);
  37. fprint(2, "T=%s D=%s C=%s procs=%d resources=%q %s%sadmit\n",
  38. period, deadline, cost, getpid(), R, besteffort?"besteffort ":"", verbose?"verbose ":"");
  39. if (fprint(fd, "T=%s D=%s C=%s procs=%d resources=%q %s%sadmit",
  40. period, deadline, cost, getpid(), R, besteffort?"besteffort ":"", verbose?"verbose ":"") < 0)
  41. sysfatal("%s: %r", clonedev);
  42. notefd = fd;
  43. atnotify(rthandler, 1);
  44. return fd;
  45. }
  46. static void
  47. usage(void)
  48. {
  49. fprint(2, "Usage: %s [-T period] [-D deadline] [-D cost] [-S sleepinterval] [-s sleeptime] [-R resources] [-v]\n", argv0);
  50. exits(nil);
  51. }
  52. void
  53. main(int argc, char *argv[])
  54. {
  55. Time sleepinterval;
  56. Time sleeptime;
  57. Time now, when;
  58. int i, j, fd;
  59. char *e;
  60. quotefmtinstall();
  61. ARGBEGIN {
  62. case 'T':
  63. T = EARGF(usage());
  64. tset++;
  65. break;
  66. case 'D':
  67. D = EARGF(usage());
  68. dset++;
  69. break;
  70. case 'C':
  71. C = EARGF(usage());
  72. cset++;
  73. break;
  74. case 'S':
  75. S = EARGF(usage());
  76. break;
  77. case 's':
  78. s = EARGF(usage());
  79. sset++;
  80. break;
  81. case 'R':
  82. R = EARGF(usage());
  83. break;
  84. case 'n':
  85. nproc = atoi(EARGF(usage()));
  86. if (nproc <= 0 || nproc > 10)
  87. sysfatal("%d processes?", nproc);
  88. break;
  89. case 'b':
  90. besteffort++;
  91. break;
  92. case 'v':
  93. verbose++;
  94. break;
  95. case 'd':
  96. debug++;
  97. break;
  98. default:
  99. usage();
  100. }
  101. ARGEND;
  102. if (S){
  103. if (e = parsetime(&sleepinterval, S))
  104. sysfatal("%s: Sleep interval: %s\n", argv0, e);
  105. if (e = parsetime(&sleeptime, s))
  106. sysfatal("%s: Sleep time: %s\n", argv0, e);
  107. }
  108. sleeptime /= 1000000;
  109. if (S && sleeptime == 0)
  110. sysfatal("%s: Sleep time too small\n", argv0);
  111. if (tset && !dset) D = T;
  112. fd = schedpars(T, D, C);
  113. for (j = 1; j < nproc; j++){
  114. switch(fork()){
  115. case -1:
  116. sysfatal("fork: %r");
  117. case 0:
  118. fprint(2, "procs+=%d\n", getpid());
  119. if (fprint(fd, "procs+=%d", getpid()) < 0)
  120. sysfatal("%s: %r", clonedev);
  121. for (;;){
  122. for(i = 0; i < 10000; i++)
  123. v+=1LL;
  124. if (S){
  125. now = nsec();
  126. if (now >= when){
  127. sleep((long)sleeptime);
  128. when = now + sleepinterval;
  129. }
  130. }
  131. }
  132. default:
  133. break;
  134. }
  135. }
  136. when = nsec() + sleepinterval;
  137. for (;;){
  138. for(i = 0; i < 100000; i++)
  139. v+=1LL;
  140. if (verbose)
  141. fprint(2, ".");
  142. if (S){
  143. now = nsec();
  144. if (now >= when){
  145. sleep((long)sleeptime);
  146. when = now + sleepinterval;
  147. }
  148. }
  149. }
  150. }