From 7bbddebd4845a6b5544670b181b74fcb01868b37 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Sun, 7 Jul 2024 16:08:48 -0500 Subject: [PATCH] Revert: Rewrite timing logic in controller, and use different logic. This reverts commit 9b21b888e52d9a7268c231bc0d520ec0be9bfcb8. This is not actually needed because a 32-bit long should not overflow with just 1000000000. The logic I replaced it with was sloppy anyway and left out some cases. The long representing nanoseconds can store greater than 999999999. Make sure that is handled before adding to the tv_nsec. --- .../controller/c/controller/private-controller.c | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/level_3/controller/c/controller/private-controller.c b/level_3/controller/c/controller/private-controller.c index 9ce6e92..c9e2f16 100644 --- a/level_3/controller/c/controller/private-controller.c +++ b/level_3/controller/c/controller/private-controller.c @@ -708,13 +708,29 @@ extern "C" { gettimeofday(&now, 0); time->tv_sec = now.tv_sec + seconds; - time->tv_nsec = now.tv_usec * 1000; + time->tv_nsec = (now.tv_usec * 1000); - // If result would be greater than 1 second, then increment seconds without overflowing. - if (time->tv_nsec > 500000000 && nanoseconds > 500000000) { + // Do not allow for nanoseconds to be too large. + if (nanoseconds > 999999999) { + long ns = nanoseconds; + + do { + ns -= 1000000000; + ++(time->tv_sec); + + } while (ns > 999999999); + + time->tv_nsec += ns; + } + else { + time->tv_nsec += nanoseconds; + } + + // If tv_nsec is 1 second or greater, then increment seconds. + if (time->tv_nsec > 999999999) { ++(time->tv_sec); - time->tv_nsec = (time->tv_nsec - 500000000) + (nanoseconds - 500000000); + time->tv_nsec -= 1000000000; } } #endif // _di_controller_time_ -- 1.8.3.1