123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #include <u.h>
- #include <libc.h>
- #include "realtime.h"
- #include "time.h"
- char * T = "10s";
- char * D = "5s";
- char * C = "1.5s";
- char * S = nil;
- char * s = "250ms";
- char * R = "";
- int verbose, debug, tset, dset, cset, sset, besteffort;
- int nproc = 1;
- uvlong v;
- char *clonedev = "#R/realtime/clone";
- char missstr[] = "sys: deadline miss: runtime";
- int notefd;
- int
- rthandler(void*, char *s)
- {
- static int umpteenth;
- if (!umpteenth++)
- fprint(2, "note received: %s\n", s);
- if (strncmp(missstr, s, strlen(missstr)) == 0)
- return 1;
- /* On any other note */
- if (fprint(notefd, "remove") < 0)
- sysfatal("Could not remove task: %r");
- sysfatal("Removed task");
- return 1;
- }
- static int
- schedpars(char *period, char *deadline, char *cost)
- {
- int fd;
- if ((fd = open(clonedev, ORDWR)) < 0)
- sysfatal("%s: %r", clonedev);
- fprint(2, "T=%s D=%s C=%s procs=%d resources=%q %s%sadmit\n",
- period, deadline, cost, getpid(), R, besteffort?"besteffort ":"", verbose?"verbose ":"");
- if (fprint(fd, "T=%s D=%s C=%s procs=%d resources=%q %s%sadmit",
- period, deadline, cost, getpid(), R, besteffort?"besteffort ":"", verbose?"verbose ":"") < 0)
- sysfatal("%s: %r", clonedev);
- notefd = fd;
- atnotify(rthandler, 1);
- return fd;
- }
- static void
- usage(void)
- {
- fprint(2, "Usage: %s [-T period] [-D deadline] [-D cost] [-S sleepinterval] [-s sleeptime] [-R resources] [-v]\n", argv0);
- exits(nil);
- }
- void
- main(int argc, char *argv[])
- {
- Time sleepinterval;
- Time sleeptime;
- Time now, when;
- int i, j, fd;
- char *e;
- quotefmtinstall();
- ARGBEGIN {
- case 'T':
- T = EARGF(usage());
- tset++;
- break;
- case 'D':
- D = EARGF(usage());
- dset++;
- break;
- case 'C':
- C = EARGF(usage());
- cset++;
- break;
- case 'S':
- S = EARGF(usage());
- break;
- case 's':
- s = EARGF(usage());
- sset++;
- break;
- case 'R':
- R = EARGF(usage());
- break;
- case 'n':
- nproc = atoi(EARGF(usage()));
- if (nproc <= 0 || nproc > 10)
- sysfatal("%d processes?", nproc);
- break;
- case 'b':
- besteffort++;
- break;
- case 'v':
- verbose++;
- break;
- case 'd':
- debug++;
- break;
- default:
- usage();
- }
- ARGEND;
- if (S){
- if (e = parsetime(&sleepinterval, S))
- sysfatal("%s: Sleep interval: %s\n", argv0, e);
- if (e = parsetime(&sleeptime, s))
- sysfatal("%s: Sleep time: %s\n", argv0, e);
- }
- sleeptime /= 1000000;
- if (S && sleeptime == 0)
- sysfatal("%s: Sleep time too small\n", argv0);
- if (tset && !dset) D = T;
- fd = schedpars(T, D, C);
- for (j = 1; j < nproc; j++){
- switch(fork()){
- case -1:
- sysfatal("fork: %r");
- case 0:
- fprint(2, "procs+=%d\n", getpid());
- if (fprint(fd, "procs+=%d", getpid()) < 0)
- sysfatal("%s: %r", clonedev);
- for (;;){
- for(i = 0; i < 10000; i++)
- v+=1LL;
- if (S){
- now = nsec();
- if (now >= when){
- sleep((long)sleeptime);
- when = now + sleepinterval;
- }
- }
- }
- default:
- break;
- }
- }
- when = nsec() + sleepinterval;
- for (;;){
- for(i = 0; i < 100000; i++)
- v+=1LL;
- if (verbose)
- fprint(2, ".");
- if (S){
- now = nsec();
- if (now >= when){
- sleep((long)sleeptime);
- when = now + sleepinterval;
- }
- }
- }
- }
|