@include @define printlist(dom) { @local p; p = dom`head; while(p){ printf("%d ", p->v); p = p->next; } printf("\n"); } @define manglelist(dom) { @local p; p = dom`head; while(p){ printf("%d ", p->v++); p = p->next; } printf("\n"); } // test printlist @define test1(n) { @local ctl, mux, ns, as, dom; mux = mkctlmux_local(); ctl = mux.launch(["./list", sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); dom.xtrap(&dom`insert, @lambda(ctl){ printlist(dom); return nil; }); dom.xcont(); mux.run(); } // test manglelist @define test2(n) { @local ctl, mux, ns, as, dom; mux = mkctlmux_local(); ctl = mux.launch(["./list", sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); dom.xtrap(&dom`insert, @lambda(ctl){ manglelist(dom); return nil; }); dom.xcont(); mux.run(); } // test syscall tracing @define test3(n) { @local ctl, mux, ns, as, dom; mux = mkctlmux_local(); ctl = mux.launch(["./list", sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); dom.trace(ctlmux`Esyscall, @lambda(ctl) { printf("-> %d hit syscall\n", ctl.id); }); dom.xcont(); mux.run(); } // test snaps @define test4(n) { @local ctl, mux, ns, as, dom; mux = mkctlmux_local(); ctl = mux.launch(["./list", sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); dom.xsnap(&dom`insert, @lambda(ctl, cctl){ printf("snap %d -> %d\n", ctl.id, cctl.id); return nil; }); dom.xcont(); mux.run(); while(1); } @define test5(n) { @local ctl, mux, ns, as, dom, s, tid; mux = mkctlmux_local(); ctl = mux.launch(["./list", sprintfa("%d", n)], 0); as = ctl.mem(); ns = ctl.ns(); dom = mkdom(ns, as); s = []; tid = dom.xtrap(&dom`insert, @lambda(ctl){ if(length(s) < 10) append(s, mkdom(ns, ctl.snap().mem())); }); dom.trace(ctlmux`Eexit, @lambda(ctl){ foreach(@lambda(d) { printf("snap %d: ", d.id()); printlist(d); d.trace(ctlmux`Eexit, @lambda(ctl) { printf("snap %d exit\n", ctl.id); }); d.trapdel(tid); // d.kill(); d.xcont(); }, s); }); dom.xcont(); mux.run(); } if(length(args) == 1){ test1(10); test2(10); test3(10); test5(10); } else if(length(args) == 2) test1(strton(args[1])); else if(length(args) == 3){ switch(args[1]){ case "1": return test1(strton(args[2])); case "2": return test2(strton(args[2])); case "3": return test3(strton(args[2])); case "4": return test4(strton(args[2])); case "5": return test5(strton(args[2])); default: error("no such test %a", args[1]); } }else error("usage: %s [] | %s ", args[0]);