~ft/npe

npe/libnpe/_npe.c -rw-r--r-- 1.6 KiB
606d1ac8Sigrid Solveig Haflínudóttir sdl: missing header change 20 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <npe.h>
#include <tos.h>
#include <sys/stat.h>
#include "_npe.h"

static void
npe_exit(int x)
{
	exits(x == 0 ? nil : "error");
}

int errno = 0;
void (*exit)(int) = npe_exit;

/*
 * nsec() is wallclock and can be adjusted by timesync
 * so need to use cycles() instead, but fall back to
 * nsec() in case we can't
 */
uvlong
npe_nanosec(void)
{
	static uvlong fasthz, xstart;
	uvlong x, div;

	if(fasthz == ~0ULL)
		return nsec() - xstart;

	if(fasthz == 0){
		if(_tos->cyclefreq){
			cycles(&xstart);
			fasthz = _tos->cyclefreq;
		} else {
			xstart = nsec();
			fasthz = ~0ULL;
			fprint(2, "cyclefreq not available, falling back to nsec()\n");
			fprint(2, "you might want to disable aux/timesync\n");
			return 0;
		}
	}
	cycles(&x);
	x -= xstart;

	/* this is ugly */
	for(div = Nsec; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);

	return x / (fasthz / div);
}

void
npe_nsleep(uvlong ns)
{
	uvlong start, end;

	start = npe_nanosec();
	end = start + ns;
	ns = start;
	do{
		if(end - ns > 85*Nmsec)
			sleep(80);
		else if (end - ns > 25*Nmsec)
			sleep(20);
		else if (end - ns > 1*Nmsec)
			sleep(1);
		else
			break;
		ns = npe_nanosec();
	}while(ns < end);
}

int
npe_mkdirp(char *s, int perm)
{
	char *p;
	int n;

	for(p = strchr(s+1, '/'); p; p = strchr(p+1, '/')){
		*p = 0;
		n = access(s, AEXIST) == 0 || mkdir(s, perm) == 0 ? 0 : -1;
		*p = '/';
		if(n != 0)
			return n;
	}
	if(access(s, AEXIST) != 0)
		return mkdir(s, perm);

	return 0;
}

float
npe_infinity(void)
{
	union {float f; u32int i;} u;

	u.i = 0x7f800000;

	return u.f;
}

float
npe_nan(void)
{
	union {float f; u32int i;} u;

	u.i = 0x7fbfffff;

	return u.f;
}