- Timestamp:
- Feb 11, 2009, 4:34:35 PM (13 years ago)
- Location:
- trunk/libtransmission
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/peer-common.h
r7824 r7874 48 48 TR_PEER_ERROR, 49 49 TR_PEER_CANCEL, 50 TR_PEER_UPLOAD_ONLY 50 TR_PEER_UPLOAD_ONLY, 51 TR_PEER_NEED_REQ 51 52 } 52 53 PeerEventType; -
trunk/libtransmission/peer-mgr.c
r7824 r7874 1 1 2 /* 2 3 * This file Copyright (C) 2007-2009 Charles Kerr <charles@transmissionbt.com> … … 127 128 tr_ptrArray peers; /* tr_peer */ 128 129 tr_ptrArray webseeds; /* tr_webseed */ 130 tr_timer * refillTimer; 129 131 tr_torrent * tor; 130 132 tr_peer * optimistic; /* the optimistic peer, or NULL if none */ … … 140 142 tr_timer * bandwidthTimer; 141 143 tr_timer * rechokeTimer; 142 tr_timer * refillTimer;143 144 tr_timer * reconnectTimer; 144 145 }; … … 380 381 381 382 memcpy( hash, t->hash, SHA_DIGEST_LENGTH ); 383 384 tr_timerFree( &t->refillTimer ); 382 385 383 386 tr_ptrArrayDestruct( &t->webseeds, (PtrArrayForeachFunc)tr_webseedFree ); … … 423 426 static int bandwidthPulse ( void * vmgr ); 424 427 static int rechokePulse ( void * vmgr ); 425 static int refillPulse ( void * vmgr );426 428 static int reconnectPulse ( void * vmgr ); 427 429 … … 435 437 m->bandwidthTimer = tr_timerNew( session, bandwidthPulse, m, BANDWIDTH_PERIOD_MSEC ); 436 438 m->rechokeTimer = tr_timerNew( session, rechokePulse, m, RECHOKE_PERIOD_MSEC ); 437 m->refillTimer = tr_timerNew( session, refillPulse, m, REFILL_PERIOD_MSEC );438 439 m->reconnectTimer = tr_timerNew( session, reconnectPulse, m, RECONNECT_PERIOD_MSEC ); 439 440 … … 449 450 450 451 tr_timerFree( &manager->reconnectTimer ); 451 tr_timerFree( &manager->refillTimer );452 452 tr_timerFree( &manager->rechokeTimer ); 453 453 tr_timerFree( &manager->bandwidthTimer ); … … 735 735 } 736 736 737 static void738 refill Torrent( Torrent *t )737 static int 738 refillPulse( void * vtorrent ) 739 739 { 740 740 tr_block_index_t block; … … 744 744 tr_webseed ** webseeds; 745 745 struct tr_blockIterator * blockIterator; 746 Torrent * t = vtorrent; 746 747 tr_torrent * tor = t->tor; 747 748 748 749 if( !t->isRunning ) 749 return ;750 return TRUE; 750 751 if( tr_torrentIsSeed( t->tor ) ) 751 return; 752 752 return TRUE; 753 754 torrentLock( t ); 753 755 tordbg( t, "Refilling Request Buffers..." ); 754 756 … … 822 824 tr_free( webseeds ); 823 825 tr_free( peers ); 824 } 825 826 static int 827 refillPulse( void * vmgr ) 828 { 829 tr_torrent * tor = NULL; 830 tr_peerMgr * mgr = vmgr; 831 managerLock( mgr ); 832 833 while(( tor = tr_torrentNext( mgr->session, tor ))) 834 if( tor->isRunning && !tr_torrentIsSeed( tor ) ) 835 refillTorrent( tor->torrentPeers ); 836 837 managerUnlock( mgr ); 838 return TRUE; 826 827 t->refillTimer = NULL; 828 torrentUnlock( t ); 829 return FALSE; 839 830 } 840 831 … … 883 874 tor->corruptCur += byteCount; 884 875 tor->downloadedCur -= MIN( tor->downloadedCur, byteCount ); 876 } 877 878 static void 879 refillSoon( Torrent * t ) 880 { 881 if( t->refillTimer == NULL ) 882 t->refillTimer = tr_timerNew( t->manager->session, 883 refillPulse, t, 884 REFILL_PERIOD_MSEC ); 885 885 } 886 886 … … 950 950 a->uploadOnly = e->uploadOnly ? UPLOAD_ONLY_YES : UPLOAD_ONLY_NO; 951 951 } 952 break; 953 954 case TR_PEER_NEED_REQ: 955 refillSoon( t ); 952 956 break; 953 957 … … 1513 1517 tr_peerMgrStartTorrent( tr_torrent * tor ) 1514 1518 { 1515 tor->torrentPeers->isRunning = TRUE; 1519 Torrent * t = tor->torrentPeers; 1520 1521 managerLock( t->manager ); 1522 1523 assert( t ); 1524 1525 if( !t->isRunning ) 1526 { 1527 t->isRunning = TRUE; 1528 1529 if( !tr_ptrArrayEmpty( &t->webseeds ) ) 1530 refillSoon( t ); 1531 } 1532 1533 managerUnlock( t->manager ); 1516 1534 } 1517 1535 -
trunk/libtransmission/peer-msgs.c
r7824 r7874 421 421 422 422 static void 423 fireNeedReq( tr_peermsgs * msgs ) 424 { 425 tr_peer_event e = blankEvent; 426 e.eventType = TR_PEER_NEED_REQ; 427 publish( msgs, &e ); 428 } 429 430 static void 423 431 firePeerProgress( tr_peermsgs * msgs ) 424 432 { … … 646 654 if( i != msgs->peer->clientIsInterested ) 647 655 sendInterest( msgs, i ); 656 if( i ) 657 fireNeedReq( msgs ); 648 658 } 649 659 … … 810 820 dbgmsg( msgs, "pump sent %d requests, now have %d active and %d queued", 811 821 sent, msgs->clientAskedFor.len, msgs->clientWillAskFor.len ); 822 823 if( len < max ) 824 fireNeedReq( msgs ); 812 825 } 813 826 … … 1354 1367 dbgmsg( msgs, "got Unchoke" ); 1355 1368 msgs->peer->clientIsChoked = 0; 1369 fireNeedReq( msgs ); 1356 1370 break; 1357 1371 … … 1379 1393 1380 1394 case BT_BITFIELD: 1395 { 1381 1396 dbgmsg( msgs, "got a bitfield" ); 1382 1397 tr_peerIoReadBytes( msgs->peer->io, inbuf, msgs->peer->have->bits, msglen ); 1383 1398 updatePeerProgress( msgs ); 1399 fireNeedReq( msgs ); 1384 1400 break; 1401 } 1385 1402 1386 1403 case BT_REQUEST: -
trunk/libtransmission/webseed.c
r7824 r7874 60 60 if( w->callback ) 61 61 w->callback( NULL, e, w->callback_userdata ); 62 } 63 64 static void 65 fireNeedReq( tr_webseed * w ) 66 { 67 tr_peer_event e = blankEvent; 68 e.eventType = TR_PEER_NEED_REQ; 69 publish( w, &e ); 62 70 } 63 71 … … 173 181 if( w->dead ) 174 182 tr_webseedFree( w ); 175 else 183 else { 176 184 fireClientGotBlock( w, w->pieceIndex, w->pieceOffset, w->byteCount ); 185 fireNeedReq( w ); 186 } 177 187 } 178 188 }
Note: See TracChangeset
for help on using the changeset viewer.