xref: /inferno-os/appl/cmd/time.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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