diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-10 02:52:31 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-10 02:52:31 +0200 |
commit | 5e37087451d857f3d329341319511d00f0c49c38 (patch) | |
tree | 29de45583b7b71cf158e3fe37295517df8dedae2 /sys/src/ape/lib/ap/plan9/9nsec.c | |
parent | 3ba1197aeb382e1750cbb0f2567794bd4482e1e2 (diff) |
ape: add internal _NSEC() function and make gettimeofday() use it
Diffstat (limited to 'sys/src/ape/lib/ap/plan9/9nsec.c')
-rw-r--r-- | sys/src/ape/lib/ap/plan9/9nsec.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/sys/src/ape/lib/ap/plan9/9nsec.c b/sys/src/ape/lib/ap/plan9/9nsec.c new file mode 100644 index 000000000..87d2e8a68 --- /dev/null +++ b/sys/src/ape/lib/ap/plan9/9nsec.c @@ -0,0 +1,43 @@ +#include "sys9.h" + +typedef unsigned long long uvlong; +typedef long long vlong; +typedef unsigned char uchar; + +static uvlong order = 0x0001020304050607ULL; + +static void +be2vlong(vlong *to, uchar *f) +{ + uchar *t, *o; + int i; + + t = (uchar*)to; + o = (uchar*)ℴ + for(i = 0; i < 8; i++) + t[o[i]] = f[i]; +} + +long long +_NSEC(void) +{ + uchar b[8]; + vlong t; + int opened; + static int fd = -1; + + opened = 0; + for(;;) { + if(fd < 0) + if(opened++ || + (fd = _OPEN("/dev/bintime", OREAD|OCEXEC)) < 0) + return 0; + if(_PREAD(fd, b, sizeof b, 0) == sizeof b) + break; /* leave fd open for future use */ + /* short read, perhaps try again */ + _CLOSE(fd); + fd = -1; + } + be2vlong(&t, b); + return t; +} |