Skip to content

Commit ef48462

Browse files
committed
fix formatting and a bug in clock_getres, and add unittest
1 parent c8bf0da commit ef48462

File tree

6 files changed

+86
-14
lines changed

6 files changed

+86
-14
lines changed

emscripten-version.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
1.23.2
1+
1.23.3
22

src/library.js

+14-12
Original file line numberDiff line numberDiff line change
@@ -5783,13 +5783,13 @@ LibraryManager.library = {
57835783
}
57845784
return _usleep((seconds * 1e6) + (nanoseconds / 1000));
57855785
},
5786-
clock_gettime__deps: ['emscripten_get_now','emscripten_get_now_monotonic','$ERRNO_CODES', '__setErrNo'],
5786+
clock_gettime__deps: ['emscripten_get_now', 'emscripten_get_now_is_monotonic', '$ERRNO_CODES', '__setErrNo'],
57875787
clock_gettime: function(clk_id, tp) {
57885788
// int clock_gettime(clockid_t clk_id, struct timespec *tp);
57895789
var now;
57905790
if (clk_id === {{{ cDefine('CLOCK_REALTIME') }}}) {
57915791
now = Date.now();
5792-
} else if (clk_id === {{{ cDefine('CLOCK_MONOTONIC') }}} && _emscripten_get_now_monotonic()) {
5792+
} else if (clk_id === {{{ cDefine('CLOCK_MONOTONIC') }}} && _emscripten_get_now_is_monotonic()) {
57935793
now = _emscripten_get_now();
57945794
} else {
57955795
___setErrNo(ERRNO_CODES.EINVAL);
@@ -5803,23 +5803,24 @@ LibraryManager.library = {
58035803
clock_settime: function(clk_id, tp) {
58045804
// int clock_settime(clockid_t clk_id, const struct timespec *tp);
58055805
// Nothing.
5806-
___setErrNo(ERRNO_CODES.EPERM);
5806+
___setErrNo(clk_id === {{{ cDefine('CLOCK_REALTIME') }}} ? ERRNO_CODES.EPERM
5807+
: ERRNO_CODES.EINVAL);
58075808
return -1;
58085809
},
5809-
clock_getres__deps: ['emscripten_get_now_res','emscripten_get_now_monotonic','$ERRNO_CODES', '__setErrNo'],
5810+
clock_getres__deps: ['emscripten_get_now_res', 'emscripten_get_now_is_monotonic', '$ERRNO_CODES', '__setErrNo'],
58105811
clock_getres: function(clk_id, res) {
58115812
// int clock_getres(clockid_t clk_id, struct timespec *res);
58125813
var nsec;
58135814
if (clk_id === {{{ cDefine('CLOCK_REALTIME') }}}) {
5814-
nsec = 1000 * 1000;
5815-
} else if (clk_id === {{{ cDefine('CLOCK_MONOTONIC') }}} && _emscripten_get_now_monotonic()) {
5816-
now = _emscripten_get_now_res();
5815+
nsec = 1000 * 1000; // educated guess that it's milliseconds
5816+
} else if (clk_id === {{{ cDefine('CLOCK_MONOTONIC') }}} && _emscripten_get_now_is_monotonic()) {
5817+
nsec = _emscripten_get_now_res();
58175818
} else {
58185819
___setErrNo(ERRNO_CODES.EINVAL);
58195820
return -1;
58205821
}
5821-
{{{ makeSetValue('res', C_STRUCTS.timespec.tv_sec, '1', 'i32') }}};
5822-
{{{ makeSetValue('res', C_STRUCTS.timespec.tv_nsec, 'nsec', 'i32') }}} // resolution is milliseconds
5822+
{{{ makeSetValue('res', C_STRUCTS.timespec.tv_sec, '(nsec/1000000000)|0', 'i32') }}};
5823+
{{{ makeSetValue('res', C_STRUCTS.timespec.tv_nsec, 'nsec', 'i32') }}} // resolution is nanoseconds
58235824
return 0;
58245825
},
58255826

@@ -8502,11 +8503,12 @@ LibraryManager.library = {
85028503
}
85038504
},
85048505

8505-
emscripten_get_now_monotonic__deps: ['emscripten_get_now'],
8506-
emscripten_get_now_monotonic: function() {
8506+
emscripten_get_now_is_monotonic__deps: ['emscripten_get_now'],
8507+
emscripten_get_now_is_monotonic: function() {
85078508
// return whether emscripten_get_now is guaranteed monotonic; the Date.now
85088509
// implementation is not :(
8509-
return (_emscripten_get_now() == Date.now)|0;
8510+
return ENVIRONMENT_IS_NODE || (typeof dateNow !== 'undefined') ||
8511+
(ENVIRONMENT_IS_WEB && window['performance'] && window['performance']['now']);
85108512
},
85118513

85128514
// Returns [parentFuncArguments, functionName, paramListName]

tests/core/test_posixtime.in

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <time.h>
2+
#include <errno.h>
3+
#include <stdio.h>
4+
5+
int main() {
6+
clockid_t clocks[] = { CLOCK_REALTIME, CLOCK_MONOTONIC };
7+
for (int i = 0; i < (int)(sizeof(clocks)/sizeof(*clocks)); ++i) {
8+
printf("%sTests for clockid_t=%d\n-----------------\n",
9+
i == 0 ? "" : "\n", clocks[i]);
10+
struct timespec ts;
11+
int rv = clock_getres(clocks[i], &ts);
12+
if (rv)
13+
printf("clock_getres failed\n");
14+
else if (ts.tv_sec || ts.tv_nsec > 50000000)
15+
printf("clock_getres resolution not enough (%ld.%09ld)\n",
16+
(long)ts.tv_sec, ts.tv_nsec);
17+
else
18+
printf("clock_getres resolution OK\n");
19+
rv = clock_gettime(clocks[i], &ts);
20+
printf(rv ? "clock_gettime failed\n" : "clock_gettime OK\n");
21+
errno = 0;
22+
if (clock_settime(clocks[i], &ts) == 0)
23+
printf("clock_settime should have failed\n");
24+
else if (errno == EPERM && clocks[i] == CLOCK_REALTIME)
25+
printf("clock_settime failed with EPERM (OK)\n");
26+
else if (errno == EINVAL && clocks[i] == CLOCK_MONOTONIC)
27+
printf("clock_settime failed with EINVAL (OK)\n");
28+
else
29+
printf("clock_settime failed with wrong error code\n");
30+
}
31+
clockid_t bogus = 42;
32+
struct timespec ts;
33+
printf("\nTests for clockid_t=%d\n-----------------\n", bogus);
34+
if (clock_gettime(bogus, &ts) == 0 || errno != EINVAL)
35+
printf("clock_gettime should have failed\n");
36+
else
37+
printf("clock_gettime failed with EINVAL (OK)\n");
38+
if (clock_getres(bogus, &ts) == 0 || errno != EINVAL)
39+
printf("clock_getres should have failed\n");
40+
else
41+
printf("clock_getres failed with EINVAL (OK)\n");
42+
if (clock_settime(bogus, &ts) == 0 || errno != EINVAL)
43+
printf("clock_settime should have failed\n");
44+
else
45+
printf("clock_settime failed with EINVAL (OK)\n");
46+
return 0;
47+
}

tests/core/test_posixtime.out

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
Tests for clockid_t=0
2+
-----------------
3+
clock_getres resolution OK
4+
clock_gettime OK
5+
clock_settime failed with EPERM (OK)
6+
7+
Tests for clockid_t=1
8+
-----------------
9+
clock_getres resolution OK
10+
clock_gettime OK
11+
clock_settime failed with EINVAL (OK)
12+
13+
Tests for clockid_t=42
14+
-----------------
15+
clock_gettime failed with EINVAL (OK)
16+
clock_getres failed with EINVAL (OK)
17+
clock_settime failed with EINVAL (OK)

tests/test_core.py

+6
Original file line numberDiff line numberDiff line change
@@ -4629,6 +4629,12 @@ def test_unistd_misc(self):
46294629
Building.COMPILER_TEST_OPTS += ['-D' + fs]
46304630
self.do_run(src, expected, js_engines=[NODE_JS])
46314631

4632+
def test_posixtime(self):
4633+
test_path = path_from_root('tests', 'core', 'test_posixtime')
4634+
src, output = (test_path + s for s in ('.in', '.out'))
4635+
4636+
self.do_run_from_file(src, output)
4637+
46324638
def test_uname(self):
46334639
test_path = path_from_root('tests', 'core', 'test_uname')
46344640
src, output = (test_path + s for s in ('.in', '.out'))

tests/time/src.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ int main() {
6767
time_t t4 = 0;
6868
time(&t4);
6969
timespec ts;
70-
assert(clock_gettime(0, &ts) == 0);
70+
assert(clock_gettime(CLOCK_REALTIME, &ts) == 0);
7171
assert(abs(ts.tv_sec - t4) <= 2);
7272
printf("time: %d\n", t4 > 1309635200ll && t4 < 1893362400ll);
7373

0 commit comments

Comments
 (0)