]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/9sys/nsec.c
allow # netpath in dial string
[plan9front.git] / sys / src / libc / 9sys / nsec.c
1 #include <u.h>
2 #include <libc.h>
3 #include <tos.h>
4
5 static uvlong order = 0x0001020304050607ULL;
6
7 static void
8 be2vlong(vlong *to, uchar *f)
9 {
10         uchar *t, *o;
11         int i;
12
13         t = (uchar*)to;
14         o = (uchar*)&order;
15         for(i = 0; i < sizeof order; i++)
16                 t[o[i]] = f[i];
17 }
18
19 static int fd = -1;
20 static struct {
21         int     pid;
22         int     fd;
23 } fds[64];
24
25 vlong
26 nsec(void)
27 {
28         uchar b[8];
29         vlong t;
30         int pid, i, f, tries;
31
32         /*
33          * Threaded programs may have multiple procs
34          * with different fd tables, so we may need to open
35          * /dev/bintime on a per-pid basis
36          */
37
38         /* First, look if we've opened it for this particular pid */
39         pid = _tos->pid;
40         do{
41                 f = -1;
42                 for(i = 0; i < nelem(fds); i++)
43                         if(fds[i].pid == pid){
44                                 f = fds[i].fd;
45                                 break;
46                         }
47                 tries = 0;
48                 if(f < 0){
49                         /* If it's not open for this pid, try the global pid */
50                         if(fd >= 0)
51                                 f = fd;
52                         else{
53                                 /* must open */
54                                 if((f = open("/dev/bintime", OREAD|OCEXEC)) < 0)
55                                         return 0;
56                                 fd = f;
57                                 for(i = 0; i < nelem(fds); i++)
58                                         if(fds[i].pid == pid || fds[i].pid == 0){
59                                                 fds[i].pid = pid;
60                                                 fds[i].fd = f;
61                                                 break;
62                                         }
63                         }
64                 }
65                 if(pread(f, b, sizeof b, 0) == sizeof b){
66                         be2vlong(&t, b);
67                         return t;
68                 }
69                 close(f);
70                 if(i < nelem(fds))
71                         fds[i].fd = -1;
72         }while(tries++ == 0);   /* retry once */
73         USED(tries);
74         return 0;
75 }