]> granicus.if.org Git - transmission/commitdiff
(trunk libT) possible fix for #2078: Assertion failed: (tv->tv_usec >= 0)
authorCharles Kerr <charles@transmissionbt.com>
Fri, 12 Jun 2009 23:01:35 +0000 (23:01 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Fri, 12 Jun 2009 23:01:35 +0000 (23:01 +0000)
libtransmission/port-forwarding.c
libtransmission/session.c
libtransmission/tr-dht.c
libtransmission/trevent.c
libtransmission/utils.c
libtransmission/utils.h

index ccdb9dc8ff0db62ac55afad0a6ea19f907200604..6595670ccceb3251daa9954637031cd5fd582718 100644 (file)
@@ -108,21 +108,21 @@ onTimer( int fd UNUSED, short what UNUSED, void * vshared )
             /* if we're mapped, everything is fine... check back in 20 minutes
              * to renew the port forwarding if it's expired */
             s->doPortCheck = TRUE;
-            interval.tv_sec = 60*20;
+            tr_timevalSet( &interval, 60*20, 0 );
             break;
 
         case TR_PORT_ERROR:
             /* some kind of an error.  wait 60 seconds and retry */
-            interval.tv_sec = 60;
+            tr_timevalSet( &interval, 60, 0 );
             break;
 
         default:
             /* in progress.  pulse frequently. */
-            interval.tv_sec = 0;
-            interval.tv_usec = 333000;
+            tr_timevalSet( &interval, 0, 333000 );
             break;
     }
 
+    assert( tr_isTimeval( &interval ) );
     evtimer_add( s->timer, &interval );
 }
 
@@ -143,10 +143,10 @@ tr_sharedInit( tr_session  * session, tr_bool isEnabled )
     if( isEnabled )
     {
         struct timeval timeval;
-        timeval.tv_sec = 0;
-        timeval.tv_usec = 333000;
+
         s->timer = tr_new0( struct event, 1 );
         evtimer_set( s->timer, onTimer, s );
+        tr_timevalSet( &timeval, 0, 333000 );
         evtimer_add( s->timer, &timeval );
     }
 
index 205aec7d02161fd784ff36fc211ab50942a9543a..623ee847c37625c70118ae3d5bf80eaca0f6a582 100644 (file)
@@ -1068,8 +1068,7 @@ setAltTimer( tr_session * session )
     assert( session->altTimer != NULL );
 
     tr_localtime_r( &now, &tm );
-    tv.tv_sec = 60 - tm.tm_sec;
-    tv.tv_usec = 0;
+    tr_timevalSet( &tv, 60-tm.tm_sec, 0 );
     evtimer_add( session->altTimer, &tv );
 }
 
index 651936d2c6d6527fb33b2291f19675a691c9f96c..1d42764cb8d2a587bc6ab302aea2afb8169a103c 100644 (file)
@@ -91,9 +91,8 @@ dht_bootstrap(void *closure)
         if(status == TR_DHT_STOPPED || status >= TR_DHT_FIREWALLED)
             break;
         tr_dhtAddNode(cl->session, &addr, port, 1);
-        tv.tv_sec = 2 + tr_cryptoWeakRandInt( 5 );
-        tv.tv_usec = tr_cryptoWeakRandInt( 1000000 );
-        select(0, NULL, NULL, NULL, &tv);
+        tr_timevalSet( &tv, 2 + tr_cryptoWeakRandInt( 5 ), tr_cryptoWeakRandInt( 1000000 ) );
+        select( 0, NULL, NULL, NULL, &tv );
     }
     tr_free( cl->nodes );
     tr_free( closure );
@@ -169,9 +168,9 @@ tr_dhtInit(tr_session *ss)
         tr_threadNew( dht_bootstrap, cl );
     }
 
-    tv.tv_sec = 0;
-    tv.tv_usec = tr_cryptoWeakRandInt( 1000000 );
+    tr_timevalSet( &tv, 0, tr_cryptoWeakRandInt( 1000000 ) );
     event_set( &dht_event, dht_socket, EV_READ, event_callback, NULL );
+    assert( tr_isTimeval( &tv ) );
     event_add( &dht_event, &tv );
 
     return 1;
@@ -376,9 +375,8 @@ event_callback(int s, short type, void *ignore UNUSED )
 
     /* Being slightly late is fine,
        and has the added benefit of adding some jitter. */
-    tv.tv_sec = tosleep;
-    tv.tv_usec = tr_cryptoWeakRandInt( 1000000 );
-    event_add(&dht_event, &tv);
+    tr_timevalSet( &tv, tosleep, tr_cryptoWeakRandInt( 1000000 ) );
+    event_add( &dht_event, &tv );
 }
 
 void
index 60909c87ae4dd4a39d39c5f21fa44ce999c65308..18fb2169ac83710bf65512b1eeabd3086369c670 100644 (file)
@@ -303,10 +303,12 @@ timerCallback( int    fd UNUSED,
     more = ( *timer->func )( timer->user_data );
     timer->inCallback = 0;
 
-    if( more )
-        evtimer_add( &timer->event, &timer->tv );
-    else
+    if( !more )
         tr_timerFree( &timer );
+    else {
+        assert( tr_isTimeval( &timer->tv ) );
+        evtimer_add( &timer->event, &timer->tv );
+    }
 }
 
 void
index 798c9938c73d732519138a479464587260edb2f1..c1c61c83ed36afcbbb719917d6f0c442b9abbedb 100644 (file)
@@ -457,6 +457,14 @@ tr_strip_positional_args( const char* str )
 ***
 **/
 
+tr_bool
+tr_isTimeval( const struct timeval * tv )
+{
+    return tv && ( tv->tv_sec >= 0 )
+              && ( tv->tv_usec >= 0 )
+              && ( tv->tv_usec < 1000000 );
+}
+
 void
 tr_timevalMsec( uint64_t milliseconds, struct timeval * setme )
 {
@@ -464,8 +472,22 @@ tr_timevalMsec( uint64_t milliseconds, struct timeval * setme )
     assert( setme != NULL );
     setme->tv_sec  = microseconds / 1000000;
     setme->tv_usec = microseconds % 1000000;
+    assert( tr_isTimeval( setme ) );
 }
 
+void
+tr_timevalSet( struct timeval * setme, int seconds, int microseconds )
+{
+    setme->tv_sec = seconds;
+    setme->tv_usec = microseconds;
+    assert( tr_isTimeval( setme ) );
+}
+
+
+/**
+***
+**/
+
 uint8_t *
 tr_loadFile( const char * path,
              size_t *     size )
index e67891bfb1acc1221c31f7b472310338df282af1..0dfa617d4cbff5038f753941bc413f9f106744e4 100644 (file)
@@ -238,7 +238,11 @@ char* tr_buildPath( const char * first_element, ... ) TR_GNUC_NULL_TERMINATED
 
 struct timeval;
 
-void tr_timevalMsec( uint64_t milliseconds, struct timeval   * setme );
+tr_bool tr_isTimeval( const struct timeval * tv );
+
+void tr_timevalMsec( uint64_t milliseconds, struct timeval * setme );
+
+void tr_timevalSet( struct timeval * setme, int seconds, int microseconds );
 
 
 /** @brief return the current date in milliseconds */