]> granicus.if.org Git - transmission/commitdiff
(trunk libT) experimental commit that will *possibly* fix the "assert( tr_isPeerIo...
authorCharles Kerr <charles@transmissionbt.com>
Sat, 24 Jan 2009 14:49:35 +0000 (14:49 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Sat, 24 Jan 2009 14:49:35 +0000 (14:49 +0000)
libtransmission/peer-io.c
libtransmission/peer-io.h

index 7744a61478c75e9c04814feea53f99e0139ac94d..4db9e650677b778be77faf5070cc581d14632f73 100644 (file)
@@ -191,6 +191,7 @@ event_read_cb( int fd, short event UNUSED, void * vio )
     assert( tr_isPeerIo( io ) );
 
     io->hasFinishedConnecting = TRUE;
+    io->pendingEvents &= ~EV_READ;
 
     curlen = EVBUFFER_LENGTH( io->inbuf );
     howmuch = curlen >= max ? 0 : max - curlen;
@@ -273,6 +274,7 @@ event_write_cb( int fd, short event UNUSED, void * vio )
     assert( tr_isPeerIo( io ) );
 
     io->hasFinishedConnecting = TRUE;
+    io->pendingEvents &= ~EV_WRITE;
 
     dbgmsg( io, "libevent says this peer is ready to write" );
 
@@ -834,28 +836,42 @@ tr_peerIoFlush( tr_peerIo  * io, tr_direction dir, size_t limit )
 static void
 event_enable( tr_peerIo * io, short event )
 {
-    if( event & EV_READ ) {
+    assert( event_initialized( &io->event_read ) );
+    assert( event_initialized( &io->event_write ) );
+
+    if( ( event & EV_READ ) && ! ( io->pendingEvents & EV_READ ) )
+    {
         dbgmsg( io, "enabling libevent ready-to-read polling" );
         event_add( &io->event_read, NULL );
+        io->pendingEvents |= EV_READ;
     }
 
-    if( event & EV_WRITE ) {
+    if( ( event & EV_WRITE ) && ! ( io->pendingEvents & EV_WRITE ) )
+    {
         dbgmsg( io, "enabling libevent ready-to-write polling" );
         event_add( &io->event_write, NULL );
+        io->pendingEvents |= EV_WRITE;
     }
 }
 
 static void
 event_disable( struct tr_peerIo * io, short event )
 {
-    if( event & EV_READ ) {
+    assert( event_initialized( &io->event_read ) );
+    assert( event_initialized( &io->event_write ) );
+
+    if( ( event & EV_READ ) && ( io->pendingEvents & EV_READ ) )
+    {
         dbgmsg( io, "disabling libevent ready-to-read polling" );
         event_del( &io->event_read );
+        io->pendingEvents &= ~EV_READ;
     }
 
-    if( event & EV_WRITE ) {
+    if( ( event & EV_WRITE ) && ( io->pendingEvents & EV_WRITE ) )
+    {
         dbgmsg( io, "disabling libevent ready-to-write polling" );
         event_del( &io->event_write );
+        io->pendingEvents &= ~EV_WRITE;
     }
 }
 
index cb0c87d4b1a4f14311644625389cd88c871fd9bd..f381488187e83c37e565685c219249ef2dbdc689 100644 (file)
@@ -69,6 +69,8 @@ typedef struct tr_peerIo
      * for reading or writing */
     tr_bool               hasFinishedConnecting;
 
+    int                   pendingEvents;
+
     int                   magicNumber;
 
     uint8_t               encryptionMode;