ape: add internal _NSEC() function and make gettimeofday() use it
This commit is contained in:
parent
3ba1197aeb
commit
5e37087451
3 changed files with 48 additions and 37 deletions
43
sys/src/ape/lib/ap/plan9/9nsec.c
Normal file
43
sys/src/ape/lib/ap/plan9/9nsec.c
Normal file
|
@ -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;
|
||||
}
|
|
@ -11,6 +11,7 @@ OFILES=\
|
|||
_getpw.$O\
|
||||
_nap.$O\
|
||||
9mallocz.$O\
|
||||
9nsec.$O\
|
||||
9iounit.$O\
|
||||
9read.$O\
|
||||
9readn.$O\
|
||||
|
|
|
@ -1,49 +1,16 @@
|
|||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#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];
|
||||
}
|
||||
/* ap/plan9/9nsec.c */
|
||||
extern long long _NSEC(void);
|
||||
|
||||
int
|
||||
gettimeofday(struct timeval *tp, struct timezone *tzp)
|
||||
{
|
||||
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);
|
||||
long long t;
|
||||
|
||||
t = _NSEC();
|
||||
tp->tv_sec = t/1000000000;
|
||||
tp->tv_usec = (t/1000)%1000000;
|
||||
|
||||
|
|
Loading…
Reference in a new issue