123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #include "u.h"
- #include "../port/lib.h"
- #include "mem.h"
- #include "dat.h"
- #include "fns.h"
- #include "../port/error.h"
- #include "ureg.h"
- enum {
- Qdir = 0,
- Qctl = 1,
- Qmalloc,
- Qtsleep,
- Qlock,
- Qmax,
- };
- static Dirtab regressdir[Qmax] = {
- {".", { Qdir, 0, QTDIR }, 0, 0555},
- {"regressctl", { Qctl, 0 }, 0, 0666},
- {"malloc", { Qmalloc, 0 }, 0, 0666},
- {"tsleep", { Qtsleep, 0 }, 0, 0666},
- {"qlock", { Qlock, 0 }, 0, 0666},
- };
- int verbose = 0;
- static QLock testlock;
- static Chan*
- regressattach(char* spec)
- {
- return devattach('Z', spec);
- }
- Walkqid*
- regresswalk(Chan* c, Chan *nc, char** name, int nname)
- {
- return devwalk(c, nc, name, nname, regressdir, Qmax, devgen);
- }
- static int32_t
- regressstat(Chan* c, uint8_t* dp, int32_t n)
- {
- return devstat(c, dp, n, regressdir, Qmax, devgen);
- }
- static Chan*
- regressopen(Chan* c, int omode)
- {
- return devopen(c, omode, regressdir, Qmax, devgen);
- }
- static void
- regressclose(Chan*unused)
- {
- }
- static int32_t
- regressread(Chan *c, void *a, int32_t n, int64_t offset)
- {
- switch((uint32_t)c->qid.path){
- case Qdir:
- return devdirread(c, a, n, regressdir, Qmax, devgen);
- case Qmalloc:
- case Qtsleep:
- break;
- case Qlock:
- qlock(&testlock);
- // sanity test code here.
- qunlock(&testlock);
- n = 1;
- break;
- default:
- error(Eperm);
- break;
- }
- return n;
- }
- static int32_t
- regresswrite(Chan *c, void *a, int32_t n, int64_t offset)
- {
- Proc *up = externup();
- char *p;
- unsigned long amt;
- switch((uint32_t)c->qid.path){
- case Qmalloc:
- p = a;
- amt = strtoull(p, 0, 0);
- if (verbose)
- print("Malloc %d\n", amt);
- p = malloc(amt);
- if (verbose)
- print("Got %p\n", p);
- free(p);
- if (verbose)
- print("Freed %p\n", p);
- return n;
- case Qtsleep:
- p = a;
- amt = strtoull(p, 0, 0);
- if (verbose)
- print("tsleep %d\n", amt);
- tsleep(&up->sleep, return0, 0, amt);
- if (verbose)
- print("done tsleep\n");
- return n;
- case Qctl:
- p = a;
- if (*p == 'v'){
- if (verbose)
- verbose--;
- } else if (*p == 'V')
- verbose++;
- else
- error("Only v or V");
- return n;
- default:
- error(Eperm);
- break;
- }
- return 0;
- }
- Dev regressdevtab = {
- .dc = L'ξ',
- .name = "regress",
- .reset = devreset,
- .init = devinit,
- .shutdown = devshutdown,
- .attach = regressattach,
- .walk = regresswalk,
- .stat = regressstat,
- .open = regressopen,
- .create = devcreate,
- .close = regressclose,
- .read = regressread,
- .bread = devbread,
- .write = regresswrite,
- .bwrite = devbwrite,
- .remove = devremove,
- .wstat = devwstat,
- };
|