summaryrefslogtreecommitdiff
path: root/appl/cmd/time.b
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /appl/cmd/time.b
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'appl/cmd/time.b')
-rw-r--r--appl/cmd/time.b97
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;
+ }
+ }
+}