summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-04-10 02:52:31 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-04-10 02:52:31 +0200
commit5e37087451d857f3d329341319511d00f0c49c38 (patch)
tree29de45583b7b71cf158e3fe37295517df8dedae2 /sys/src/ape/lib/ap
parent3ba1197aeb382e1750cbb0f2567794bd4482e1e2 (diff)
ape: add internal _NSEC() function and make gettimeofday() use it
Diffstat (limited to 'sys/src/ape/lib/ap')
-rw-r--r--sys/src/ape/lib/ap/plan9/9nsec.c43
-rw-r--r--sys/src/ape/lib/ap/plan9/mkfile1
2 files changed, 44 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*)&order;
+ 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;
+}
diff --git a/sys/src/ape/lib/ap/plan9/mkfile b/sys/src/ape/lib/ap/plan9/mkfile
index 502d00f8b..1da4318a4 100644
--- a/sys/src/ape/lib/ap/plan9/mkfile
+++ b/sys/src/ape/lib/ap/plan9/mkfile
@@ -11,6 +11,7 @@ OFILES=\
_getpw.$O\
_nap.$O\
9mallocz.$O\
+ 9nsec.$O\
9iounit.$O\
9read.$O\
9readn.$O\