implement Cswedge; include "sys.m"; sys: Sys; include "draw.m"; Cswedge: module { init: fn(nil: ref Draw->Context, nil: list of string); }; progname: string; init(nil: ref Draw->Context, args: list of string) { sys = load Sys Sys->PATH; progname = hd args; if(len args != 2) { sys->fprint(sys->fildes(2), "usage: %s csfile\n", progname); raise "fail:usage"; } csfile := hd tl args; if((fd := sys->open(csfile, Sys->ORDWR)) == nil) { sys->fprint(sys->fildes(2), "%s: open %s: %r\n", progname, csfile); raise "fail:open"; } sys->pctl(Sys->NEWPGRP, nil); N := 4; sync := chan of int; for(i := 0; i < N; i++) spawn wedge(fd, i, sync); for(i = 0; i < N; i++) <-sync; sys->print("\n"); sys->print("ok\n"); } wedge(fd: ref Sys->FD, pid: int, sync: chan of int) { q := array of byte "tcp!::1!http"; for(i := 0; i < 100 && (n := sys->pwrite(fd, q, len q, big 0)) > 0; i++) sys->print("%d", pid); if(n < 0) { sys->fprint(sys->fildes(2), "%s: write: %r\n", progname); raise "fail:write"; } sync <-= 69105; } # bind '#I' /net.alt # ndb/cs -x /net.alt # cswedge /net.alt/cs