diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/cmd/time.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/cmd/time.b')
| -rw-r--r-- | appl/cmd/time.b | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/appl/cmd/time.b b/appl/cmd/time.b new file mode 100644 index 00000000..b4fba159 --- /dev/null +++ b/appl/cmd/time.b @@ -0,0 +1,97 @@ +implement Time; + +include "sys.m"; +include "draw.m"; +include "sh.m"; + +FD: import Sys; +Context: import Draw; + +Time: module +{ + init: fn(ctxt: ref Context, argv: list of string); +}; + +sys: Sys; +stderr, waitfd: ref FD; + +init(ctxt: ref Context, argv: list of string) +{ + sys = load Sys Sys->PATH; + + stderr = sys->fildes(2); + + waitfd = sys->open("#p/"+string sys->pctl(0, nil)+"/wait", sys->OREAD); + if(waitfd == nil){ + sys->fprint(stderr, "time: open wait: %r\n"); + return; + } + + argv = tl argv; + + if(argv == nil) { + sys->fprint(stderr, "usage: time cmd ...\n"); + return; + } + + file := hd argv; + + if(len file<4 || file[len file-4:]!=".dis") + file += ".dis"; + + t0 := sys->millisec(); + + c := load Command file; + if(c == nil) { + err := sys->sprint("%r"); + if(1){ + c = load Command "/dis/"+file; + if(c == nil) + err = sys->sprint("%r"); + } + if(c == nil) { + sys->fprint(stderr, "time: %s: %s\n", hd argv, err); + return; + } + } + + t1 := sys->millisec(); + + pidc := chan of int; + + spawn cmd(ctxt, c, pidc, argv); + waitfor(<-pidc); + + t2 := sys->millisec(); + + f1 := real (t1 - t0) /1000.; + f2 := real (t2 - t1) /1000.; + sys->fprint(stderr, "%.4gl %.4gr %.4gt\n", f1, f2, f1+f2); +} + +cmd(ctxt: ref Context, c: Command, pidc: chan of int, argv: list of string) +{ + pidc <-= sys->pctl(0, nil); + c->init(ctxt, argv); +} + +waitfor(pid: int) +{ + buf := array[sys->WAITLEN] of byte; + status := ""; + for(;;){ + n := sys->read(waitfd, buf, len buf); + if(n < 0) { + sys->fprint(stderr, "sh: read wait: %r\n"); + return; + } + status = string buf[0:n]; + if(status[len status-1] != ':') + sys->fprint(stderr, "%s\n", status); + who := int status; + if(who != 0) { + if(who == pid) + return; + } + } +} |
