resproc.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "time.h"
  4. int T = 201;
  5. int D = 179;
  6. int C = 11;
  7. int verbose, debug, tset, dset, cset, sset;
  8. int nproc = 1;
  9. int umpteenth;
  10. char *resources = "a 4ms";
  11. uvlong v;
  12. uvlong onems;
  13. char *clonedev = "#R/realtime/clone";
  14. char missstr[] = "sys: deadline miss: runtime";
  15. int notefd;
  16. int
  17. rthandler(void*, char *s)
  18. {
  19. umpteenth++;
  20. if (strncmp(missstr, s, strlen(missstr)) == 0)
  21. return 1;
  22. fprint(2, "note received: %s\n", s);
  23. /* On any other note */
  24. if (fprint(notefd, "remove") < 0)
  25. sysfatal("Could not remove task: %r");
  26. sysfatal("Removed task");
  27. return 1;
  28. }
  29. static void
  30. usage(void)
  31. {
  32. fprint(2, "Usage: %s [-T period] [-D deadline] [-D cost] [-v] [resource...]\n", argv0);
  33. exits(nil);
  34. }
  35. void
  36. main(int argc, char *argv[])
  37. {
  38. int fd;
  39. quotefmtinstall();
  40. ARGBEGIN {
  41. case 'T':
  42. T = strtoul(EARGF(usage()), nil, 0);
  43. tset++;
  44. break;
  45. case 'D':
  46. D = strtoul(EARGF(usage()), nil, 0);
  47. dset++;
  48. break;
  49. case 'C':
  50. C = strtoul(EARGF(usage()), nil, 0);
  51. cset++;
  52. break;
  53. case 'v':
  54. verbose++;
  55. break;
  56. case 'd':
  57. debug++;
  58. break;
  59. default:
  60. usage();
  61. }
  62. ARGEND;
  63. if ((fd = open(clonedev, ORDWR)) < 0)
  64. sysfatal("%s: %r", clonedev);
  65. fprint(2, "T=%dms D=%dms C=%dms procs=self admit\n", 100, 100, 10);
  66. notefd = fd;
  67. atnotify(rthandler, 1);
  68. if (fprint(fd, "T=%dms D=%dms C=%dms procs=self admit", 100, 100, 10) < 0)
  69. sysfatal("%s: %r", clonedev);
  70. while(umpteenth ==0)
  71. v+=1LL;
  72. if (fprint(fd, "expel") < 0)
  73. sysfatal("%s: expel: %r", clonedev);
  74. onems = v/10;
  75. if (verbose)
  76. print("One millisecond is %llud cycles\n", v);
  77. if (tset && !dset) D = T;
  78. fprint(2, "T=%dms D=%dms C=%dms procs=%d resources=%q %sadmit\n",
  79. T, D, C, getpid(), resources, verbose?"verbose ":"");
  80. notefd = fd;
  81. atnotify(rthandler, 1);
  82. if (fprint(fd, "T=%dms D=%dms C=%dms procs=%d resources=%q %sadmit",
  83. T, D, C, getpid(), resources, verbose?"verbose ":"") < 0)
  84. sysfatal("%s: %r", clonedev);
  85. for (;;){
  86. if (fprint(fd, "acquire=a") < 0)
  87. sysfatal("%s: acquire=a: %r", clonedev);
  88. v = 3*onems;
  89. while(v != 0LL)
  90. v -= 1LL;
  91. if (fprint(fd, "release=a") < 0)
  92. sysfatal("%s: release=a: %r", clonedev);
  93. v = 5*onems;
  94. while(v != 0LL)
  95. v -= 1LL;
  96. if (fprint(fd, "yield") < 0)
  97. sysfatal("%s: yield a: %r", clonedev);
  98. }
  99. }