The speed_up method could set the Interval to zero, which is a bug.
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Tue, 19 Apr 2011 12:00:25 +0000 (14:00 +0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Tue, 19 Apr 2011 12:00:25 +0000 (14:00 +0200)
- also added asserts to harden the code and ensure the Interval will never become an invalid value.

src/host/pinginterval.h

index f76272c..6e0a480 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef PINGINTERVAL_H
 #define PINGINTERVAL_H
 
+#include <boost/assert.hpp>
+
 //-----------------------------------------------------------------------------
 // PingInterval
 //-----------------------------------------------------------------------------
@@ -39,6 +41,7 @@ template<typename T>
         OriginalInterval( interval ),
         Interval( interval )
     {
+        BOOST_ASSERT( 0 < interval );
     }
 
 template<typename T>
@@ -49,6 +52,8 @@ template<typename T>
 template<typename T>
     PingInterval<T>::operator T()
     {
+        BOOST_ASSERT( 0 < Interval );
+
         return Interval;
     }
 
@@ -56,13 +61,26 @@ template<typename T>
     void PingInterval<T>::back_to_original()
     {
         Interval = OriginalInterval;
+
+        BOOST_ASSERT( 0 < Interval );
     }
 
 template<typename T>
     void PingInterval<T>::speed_up()
     {
+        BOOST_ASSERT( 0 < Interval );
+
         if ( can_speed_up() )
+        {
             Interval = Interval / 2;
+        }
+
+        if ( Interval < 1 )
+        {
+            Interval = 1;
+        }
+
+        BOOST_ASSERT( 0 < Interval );
     }
 
 template<typename T>
@@ -70,7 +88,7 @@ template<typename T>
     {
         T half_original = OriginalInterval / 2;
 
-        return (Interval > half_original);
+        return ( Interval > half_original );
     }