1*37da2899SCharles.Forsythimplement Time; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsythinclude "draw.m"; 5*37da2899SCharles.Forsythinclude "sh.m"; 6*37da2899SCharles.Forsyth 7*37da2899SCharles.ForsythFD: import Sys; 8*37da2899SCharles.ForsythContext: import Draw; 9*37da2899SCharles.Forsyth 10*37da2899SCharles.ForsythTime: module 11*37da2899SCharles.Forsyth{ 12*37da2899SCharles.Forsyth init: fn(ctxt: ref Context, argv: list of string); 13*37da2899SCharles.Forsyth}; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsythsys: Sys; 16*37da2899SCharles.Forsythstderr, waitfd: ref FD; 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsythinit(ctxt: ref Context, argv: list of string) 19*37da2899SCharles.Forsyth{ 20*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 21*37da2899SCharles.Forsyth 22*37da2899SCharles.Forsyth stderr = sys->fildes(2); 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth waitfd = sys->open("#p/"+string sys->pctl(0, nil)+"/wait", sys->OREAD); 25*37da2899SCharles.Forsyth if(waitfd == nil){ 26*37da2899SCharles.Forsyth sys->fprint(stderr, "time: open wait: %r\n"); 27*37da2899SCharles.Forsyth return; 28*37da2899SCharles.Forsyth } 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth argv = tl argv; 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth if(argv == nil) { 33*37da2899SCharles.Forsyth sys->fprint(stderr, "usage: time cmd ...\n"); 34*37da2899SCharles.Forsyth return; 35*37da2899SCharles.Forsyth } 36*37da2899SCharles.Forsyth 37*37da2899SCharles.Forsyth file := hd argv; 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth if(len file<4 || file[len file-4:]!=".dis") 40*37da2899SCharles.Forsyth file += ".dis"; 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth t0 := sys->millisec(); 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth c := load Command file; 45*37da2899SCharles.Forsyth if(c == nil) { 46*37da2899SCharles.Forsyth err := sys->sprint("%r"); 47*37da2899SCharles.Forsyth if(1){ 48*37da2899SCharles.Forsyth c = load Command "/dis/"+file; 49*37da2899SCharles.Forsyth if(c == nil) 50*37da2899SCharles.Forsyth err = sys->sprint("%r"); 51*37da2899SCharles.Forsyth } 52*37da2899SCharles.Forsyth if(c == nil) { 53*37da2899SCharles.Forsyth sys->fprint(stderr, "time: %s: %s\n", hd argv, err); 54*37da2899SCharles.Forsyth return; 55*37da2899SCharles.Forsyth } 56*37da2899SCharles.Forsyth } 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth t1 := sys->millisec(); 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth pidc := chan of int; 61*37da2899SCharles.Forsyth 62*37da2899SCharles.Forsyth spawn cmd(ctxt, c, pidc, argv); 63*37da2899SCharles.Forsyth waitfor(<-pidc); 64*37da2899SCharles.Forsyth 65*37da2899SCharles.Forsyth t2 := sys->millisec(); 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth f1 := real (t1 - t0) /1000.; 68*37da2899SCharles.Forsyth f2 := real (t2 - t1) /1000.; 69*37da2899SCharles.Forsyth sys->fprint(stderr, "%.4gl %.4gr %.4gt\n", f1, f2, f1+f2); 70*37da2899SCharles.Forsyth} 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsythcmd(ctxt: ref Context, c: Command, pidc: chan of int, argv: list of string) 73*37da2899SCharles.Forsyth{ 74*37da2899SCharles.Forsyth pidc <-= sys->pctl(0, nil); 75*37da2899SCharles.Forsyth c->init(ctxt, argv); 76*37da2899SCharles.Forsyth} 77*37da2899SCharles.Forsyth 78*37da2899SCharles.Forsythwaitfor(pid: int) 79*37da2899SCharles.Forsyth{ 80*37da2899SCharles.Forsyth buf := array[sys->WAITLEN] of byte; 81*37da2899SCharles.Forsyth status := ""; 82*37da2899SCharles.Forsyth for(;;){ 83*37da2899SCharles.Forsyth n := sys->read(waitfd, buf, len buf); 84*37da2899SCharles.Forsyth if(n < 0) { 85*37da2899SCharles.Forsyth sys->fprint(stderr, "sh: read wait: %r\n"); 86*37da2899SCharles.Forsyth return; 87*37da2899SCharles.Forsyth } 88*37da2899SCharles.Forsyth status = string buf[0:n]; 89*37da2899SCharles.Forsyth if(status[len status-1] != ':') 90*37da2899SCharles.Forsyth sys->fprint(stderr, "%s\n", status); 91*37da2899SCharles.Forsyth who := int status; 92*37da2899SCharles.Forsyth if(who != 0) { 93*37da2899SCharles.Forsyth if(who == pid) 94*37da2899SCharles.Forsyth return; 95*37da2899SCharles.Forsyth } 96*37da2899SCharles.Forsyth } 97*37da2899SCharles.Forsyth} 98