diff --git a/libc/calls/_timespec_mono.c b/libc/calls/_timespec_mono.c index 191784f4f..376966d81 100644 --- a/libc/calls/_timespec_mono.c +++ b/libc/calls/_timespec_mono.c @@ -19,13 +19,9 @@ #include "libc/assert.h" #include "libc/calls/struct/timespec.h" #include "libc/sysv/consts/clock.h" -#include "libc/sysv/consts/nr.h" -#include "libc/time/time.h" struct timespec _timespec_mono(void) { - int ax, dx; struct timespec ts; - ax = clock_gettime(CLOCK_MONOTONIC_FAST, &ts); - assert(!ax); + _npassert(!clock_gettime(CLOCK_MONOTONIC_FAST, &ts)); return ts; } diff --git a/libc/calls/_timespec_real.c b/libc/calls/_timespec_real.c index 80912dc1f..2e49004c6 100644 --- a/libc/calls/_timespec_real.c +++ b/libc/calls/_timespec_real.c @@ -16,15 +16,12 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" #include "libc/calls/struct/timespec.h" #include "libc/sysv/consts/clock.h" -#include "libc/sysv/consts/nr.h" -#include "libc/time/time.h" struct timespec _timespec_real(void) { - int ax, dx; struct timespec ts; - ax = clock_gettime(CLOCK_REALTIME_FAST, &ts); - if (ax) notpossible; + _npassert(!clock_gettime(CLOCK_REALTIME_FAST, &ts)); return ts; } diff --git a/libc/calls/_timespec_tomicros.c b/libc/calls/_timespec_tomicros.c index 04cc75766..543c31234 100644 --- a/libc/calls/_timespec_tomicros.c +++ b/libc/calls/_timespec_tomicros.c @@ -27,6 +27,8 @@ int64_t _timespec_tomicros(struct timespec x) { if (!__builtin_mul_overflow(x.tv_sec, 1000000ul, &us) && !__builtin_add_overflow(us, x.tv_nsec / 1000, &us)) { return us; + } else if (x.tv_sec < 0) { + return INT64_MIN; } else { return INT64_MAX; } diff --git a/libc/calls/_timespec_tomillis.c b/libc/calls/_timespec_tomillis.c index dffa0b29c..20ef6f2c5 100644 --- a/libc/calls/_timespec_tomillis.c +++ b/libc/calls/_timespec_tomillis.c @@ -27,6 +27,8 @@ int64_t _timespec_tomillis(struct timespec x) { if (!__builtin_mul_overflow(x.tv_sec, 1000ul, &ms) && !__builtin_add_overflow(ms, x.tv_nsec / 1000000, &ms)) { return ms; + } else if (x.tv_sec < 0) { + return INT64_MIN; } else { return INT64_MAX; } diff --git a/libc/calls/_timespec_tonanos.c b/libc/calls/_timespec_tonanos.c index 4e80a0539..369b66ed0 100644 --- a/libc/calls/_timespec_tonanos.c +++ b/libc/calls/_timespec_tonanos.c @@ -27,6 +27,8 @@ int64_t _timespec_tonanos(struct timespec x) { if (!__builtin_mul_overflow(x.tv_sec, 1000000000ul, &ns) && !__builtin_add_overflow(ns, x.tv_nsec, &ns)) { return ns; + } else if (x.tv_sec < 0) { + return INT64_MIN; } else { return INT64_MAX; } diff --git a/test/libc/calls/_timespec_test.c b/test/libc/calls/_timespec_test.c index 4f5887609..bd2d586d9 100644 --- a/test/libc/calls/_timespec_test.c +++ b/test/libc/calls/_timespec_test.c @@ -17,6 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/timespec.h" +#include "libc/limits.h" #include "libc/stdio/rand.h" #include "libc/testlib/testlib.h" @@ -64,14 +65,20 @@ TEST(_timespec_frommicros, test) { TEST(_timespec_tomillis, test) { EXPECT_EQ(2123, _timespec_tomillis((struct timespec){2, 123000000})); + EXPECT_EQ(INT64_MAX, _timespec_tomillis((struct timespec){INT64_MAX, 0})); + EXPECT_EQ(INT64_MIN, _timespec_tomillis((struct timespec){INT64_MIN, 0})); } TEST(_timespec_tomicros, test) { EXPECT_EQ(2000123, _timespec_tomicros((struct timespec){2, 123000})); + EXPECT_EQ(INT64_MAX, _timespec_tomicros((struct timespec){INT64_MAX, 0})); + EXPECT_EQ(INT64_MIN, _timespec_tomicros((struct timespec){INT64_MIN, 0})); } TEST(_timespec_tonanos, test) { EXPECT_EQ(2000123000, _timespec_tonanos((struct timespec){2, 123000})); + EXPECT_EQ(INT64_MAX, _timespec_tonanos((struct timespec){INT64_MAX, 0})); + EXPECT_EQ(INT64_MIN, _timespec_tonanos((struct timespec){INT64_MIN, 0})); } static long mod(long x, long y) {