# HG changeset patch # User Chris Cannam # Date 1479473601 0 # Node ID b7b84ae5f0a7ac8fd80ba1504ef1ae9cb9d6cd8b # Parent 1d8418cca63afe78d07afbde52b1805dfdbb9574 Fix fairly obscure mis-canonicalisation in RealTime (leading to non-canonical but still correct values) diff -r 1d8418cca63a -r b7b84ae5f0a7 base/RealTimeSV.cpp --- a/base/RealTimeSV.cpp Thu Nov 17 14:46:03 2016 +0000 +++ b/base/RealTimeSV.cpp Fri Nov 18 12:53:21 2016 +0000 @@ -48,10 +48,10 @@ while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } } else if (sec < 0) { while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } - while (nsec > 0) { nsec -= ONE_BILLION; ++sec; } + while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } } else { while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } - while (nsec < 0) { nsec += ONE_BILLION; --sec; } + while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } } } diff -r 1d8418cca63a -r b7b84ae5f0a7 base/test/TestOurRealTime.h --- a/base/test/TestOurRealTime.h Thu Nov 17 14:46:03 2016 +0000 +++ b/base/test/TestOurRealTime.h Fri Nov 18 12:53:21 2016 +0000 @@ -62,6 +62,9 @@ QCOMPARE(RealTime(-1, ONE_BILLION), RealTime(0, 0)); QCOMPARE(RealTime(-1, -ONE_BILLION), RealTime(-2, 0)); + QCOMPARE(RealTime(1, -ONE_BILLION-ONE_BILLION/2), RealTime(0, -ONE_BILLION/2)); + QCOMPARE(RealTime(-1, ONE_BILLION+ONE_BILLION/2), RealTime(0, ONE_BILLION/2)); + QCOMPARE(RealTime(2, -ONE_BILLION*2), RealTime(0, 0)); QCOMPARE(RealTime(2, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));