diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/stats.h | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/util/stats.h b/src/util/stats.h index 978893a51..4dbf31120 100644 --- a/src/util/stats.h +++ b/src/util/stats.h @@ -509,16 +509,20 @@ public: inline ::timespec& operator+=(::timespec& a, const ::timespec& b) { // assumes a.tv_nsec and b.tv_nsec are in range const long nsec_per_sec = 1000000000L; // one thousand million + Assert(a.tv_nsec >= 0 && a.tv_nsec < nsec_per_sec); + Assert(b.tv_nsec >= 0 && b.tv_nsec < nsec_per_sec); a.tv_sec += b.tv_sec; long nsec = a.tv_nsec + b.tv_nsec; - while(nsec < 0) { + Assert(nsec >= 0); + if(nsec < 0) { nsec += nsec_per_sec; - ++a.tv_sec; + --a.tv_sec; } - while(nsec >= nsec_per_sec) { + if(nsec >= nsec_per_sec) { nsec -= nsec_per_sec; - --a.tv_sec; + ++a.tv_sec; } + Assert(nsec >= 0 && nsec < nsec_per_sec); a.tv_nsec = nsec; return a; } @@ -527,16 +531,19 @@ inline ::timespec& operator+=(::timespec& a, const ::timespec& b) { inline ::timespec& operator-=(::timespec& a, const ::timespec& b) { // assumes a.tv_nsec and b.tv_nsec are in range const long nsec_per_sec = 1000000000L; // one thousand million + Assert(a.tv_nsec >= 0 && a.tv_nsec < nsec_per_sec); + Assert(b.tv_nsec >= 0 && b.tv_nsec < nsec_per_sec); a.tv_sec -= b.tv_sec; long nsec = a.tv_nsec - b.tv_nsec; - while(nsec < 0) { + if(nsec < 0) { nsec += nsec_per_sec; - ++a.tv_sec; + --a.tv_sec; } - while(nsec >= nsec_per_sec) { + if(nsec >= nsec_per_sec) { nsec -= nsec_per_sec; - --a.tv_sec; + ++a.tv_sec; } + Assert(nsec >= 0 && nsec < nsec_per_sec); a.tv_nsec = nsec; return a; } |