diff --git a/include/bits/sys/time.h b/include/bits/sys/time.h index 56189a8cf6ac91dc86c512468df19e0b0aebf6b2..0b4f8f285c7edf59a09255afbca9648780757cf5 100644 --- a/include/bits/sys/time.h +++ b/include/bits/sys/time.h @@ -2,7 +2,7 @@ #define _BITS_SYS_TIME #define timeradd(x,y,res) (void) (\ - (res)->tv_sec = (x)->tv_sec + (y)->tv_sec + ((x)->tv_usec + (y)->tv_usec / 1000000), \ + (res)->tv_sec = (x)->tv_sec + (y)->tv_sec + (((x)->tv_usec + (y)->tv_usec) / 1000000), \ (res)->tv_usec = ((x)->tv_usec + (y)->tv_usec) % 1000000 \ ) #define timersub(x,y,res) (void) ( \ diff --git a/tests/time/macros.c b/tests/time/macros.c index 05f094a46e615fc0db07b307f32400ad2af7198a..b33f78b7505238e58f1a067ae64a2b54fb0affbd 100644 --- a/tests/time/macros.c +++ b/tests/time/macros.c @@ -2,10 +2,12 @@ #include <sys/time.h> int main() { - struct timeval x = { .tv_sec = 0, .tv_usec = 15 }; - struct timeval y = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval one = { .tv_sec = 0, .tv_usec = 1 }; - struct timeval max_usec = { .tv_sec = 0, .tv_usec = 999999 }; + struct timeval x = { .tv_usec = 15 }; + struct timeval y = { 0 }; + struct timeval z = { 0 }; + struct timeval one_usec = { .tv_usec = 1 }; + struct timeval max_usec = { .tv_usec = 999999 }; + struct timeval one_sec = { .tv_sec = 1 }; assert(!timerisset(&y)); assert(timerisset(&x)); @@ -13,14 +15,22 @@ int main() { assert(!timerisset(&x)); assert(timercmp(&x, &y, ==)); - timeradd(&y, &one, &y); - assert(!timercmp(&x, &y, ==)); - assert(timercmp(&x, &y, <)); + timeradd(&y, &one_usec, &z); + assert(!timercmp(&x, &z, ==)); + assert(timercmp(&x, &z, <)); - timeradd(&y, &max_usec, &y); + timeradd(&z, &max_usec, &y); assert(y.tv_sec == 1); assert(y.tv_usec == 0); - timersub(&y, &one, &y); - assert(y.tv_sec == 0); + timersub(&y, &one_usec, &z); + assert(z.tv_sec == 0); + assert(z.tv_usec == 999999); + timeradd(&z, &one_sec, &y); + assert(y.tv_sec == 1); + assert(y.tv_usec == 999999); + for (int i = 0; i < 3; i += 1) { + timersub(&y, &one_sec, &y); + } + assert(y.tv_sec == -2); assert(y.tv_usec == 999999); }