xref: /plan9/sys/src/libc/9sys/times.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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