aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2024-09-06 12:43:45 +0200
committerStefano Brivio <sbrivio@redhat.com>2024-09-06 13:01:34 +0200
commit63513e54f3208566ecb746d204ebeaafdd2c79c1 (patch)
tree892ee47045f8485243bbbd70cccd33d11c0fd78d
parent748ef4cd6e7d7307b4c91cbe59ad040ef535dbdc (diff)
downloadpasst-63513e54f3208566ecb746d204ebeaafdd2c79c1.tar
passt-63513e54f3208566ecb746d204ebeaafdd2c79c1.tar.gz
passt-63513e54f3208566ecb746d204ebeaafdd2c79c1.tar.bz2
passt-63513e54f3208566ecb746d204ebeaafdd2c79c1.tar.lz
passt-63513e54f3208566ecb746d204ebeaafdd2c79c1.tar.xz
passt-63513e54f3208566ecb746d204ebeaafdd2c79c1.tar.zst
passt-63513e54f3208566ecb746d204ebeaafdd2c79c1.zip
util: Fix order of operands and carry of one second in timespec_diff_us()
If the nanoseconds of the minuend timestamp are less than the nanoseconds of the subtrahend timestamp, we need to carry one second in the subtraction. I subtracted this second from the minuend, but didn't actually carry it in the subtraction of nanoseconds, and logged timestamps would jump back whenever we switched to the first branch of timespec_diff_us() from the second one. Most likely, the reason why I didn't carry the second is that I instinctively thought that swapping the operands would have the same effect. But it doesn't, in general: that only happens with arithmetic in modulo powers of 2. Undo the swap as well. Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r--util.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/util.c b/util.c
index 6e64279..eede4e5 100644
--- a/util.c
+++ b/util.c
@@ -249,7 +249,7 @@ void sock_probe_mem(struct ctx *c)
int64_t timespec_diff_us(const struct timespec *a, const struct timespec *b)
{
if (a->tv_nsec < b->tv_nsec) {
- return (b->tv_nsec - a->tv_nsec) / 1000 +
+ return (a->tv_nsec + 1000000000 - b->tv_nsec) / 1000 +
(a->tv_sec - b->tv_sec - 1) * 1000000;
}