summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/stats.h23
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;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback