13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier
43e12c5d1SDavid du Colombier static
53e12c5d1SDavid du Colombier char*
skip(char * p)63e12c5d1SDavid du Colombier skip(char *p)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier
93e12c5d1SDavid du Colombier while(*p == ' ')
103e12c5d1SDavid du Colombier p++;
113e12c5d1SDavid du Colombier while(*p != ' ' && *p != 0)
123e12c5d1SDavid du Colombier p++;
133e12c5d1SDavid du Colombier return p;
143e12c5d1SDavid du Colombier }
153e12c5d1SDavid du Colombier
16*7dd7cddfSDavid du Colombier /*
17*7dd7cddfSDavid du Colombier * after a fork with fd's copied, both fd's are pointing to
18*7dd7cddfSDavid du Colombier * the same Chan structure. Since the offset is kept in the Chan
19*7dd7cddfSDavid du Colombier * structure, the seek's and read's in the two processes can be
20*7dd7cddfSDavid du Colombier * are competing moving the offset around. Hence the unusual loop
21*7dd7cddfSDavid du Colombier * in the middle of this routine.
22*7dd7cddfSDavid du Colombier */
233e12c5d1SDavid du Colombier long
times(long * t)243e12c5d1SDavid du Colombier times(long *t)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier char b[200], *p;
273e12c5d1SDavid du Colombier static int f = -1;
28*7dd7cddfSDavid du Colombier int i, retries;
293e12c5d1SDavid du Colombier ulong r;
303e12c5d1SDavid du Colombier
313e12c5d1SDavid du Colombier memset(b, 0, sizeof(b));
32*7dd7cddfSDavid du Colombier for(retries = 0; retries < 100; retries++){
333e12c5d1SDavid du Colombier if(f < 0)
343e12c5d1SDavid du Colombier f = open("/dev/cputime", OREAD|OCEXEC);
35*7dd7cddfSDavid du Colombier if(f < 0)
36*7dd7cddfSDavid du Colombier break;
37*7dd7cddfSDavid du Colombier if(seek(f, 0, 0) < 0 || (i = read(f, b, sizeof(b))) < 0){
38*7dd7cddfSDavid du Colombier close(f);
39*7dd7cddfSDavid du Colombier f = -1;
40*7dd7cddfSDavid du Colombier } else {
41*7dd7cddfSDavid du Colombier if(i != 0)
42*7dd7cddfSDavid du Colombier break;
43*7dd7cddfSDavid du Colombier }
443e12c5d1SDavid du Colombier }
453e12c5d1SDavid du Colombier p = b;
463e12c5d1SDavid du Colombier if(t)
473e12c5d1SDavid du Colombier t[0] = atol(p);
483e12c5d1SDavid du Colombier p = skip(p);
493e12c5d1SDavid du Colombier if(t)
503e12c5d1SDavid du Colombier t[1] = atol(p);
513e12c5d1SDavid du Colombier p = skip(p);
523e12c5d1SDavid du Colombier r = atol(p);
533e12c5d1SDavid du Colombier if(t){
543e12c5d1SDavid du Colombier p = skip(p);
553e12c5d1SDavid du Colombier t[2] = atol(p);
563e12c5d1SDavid du Colombier p = skip(p);
573e12c5d1SDavid du Colombier t[3] = atol(p);
583e12c5d1SDavid du Colombier }
593e12c5d1SDavid du Colombier return r;
603e12c5d1SDavid du Colombier }
61