fix recursive crash when stopping a torrent, reported by plantain. silence a few more console messages.

This commit is contained in:
Charles Kerr 2007-09-21 14:20:55 +00:00
parent 54c84d0b30
commit 9248143ce8
5 changed files with 22 additions and 19 deletions

View File

@ -115,7 +115,6 @@ struct tr_torrent
int error;
char errorString[128];
int hasChangedState;
uint8_t obfuscatedHash[SHA_DIGEST_LENGTH];
@ -136,18 +135,14 @@ struct tr_torrent
struct tr_completion * completion;
volatile char dieFlag;
struct tr_bitfield * uncheckedPieces;
run_status_t runStatus;
run_status_t runStatusToSave;
char runStatusToSaveIsSet;
cp_status_t cpStatus;
struct tr_lock * lock;
struct tr_tracker * tracker;
struct tr_publisher_tag * trackerSubscription;
uint64_t startDate;
uint64_t stopDate;
uint64_t downloadedCur;
uint64_t downloadedPrev;
@ -155,11 +150,17 @@ struct tr_torrent
uint64_t uploadedPrev;
uint64_t corruptCur;
uint64_t corruptPrev;
uint64_t startDate;
uint64_t stopDate;
uint64_t activityDate;
uint8_t pexDisabled;
unsigned int runStatusToSaveIsSet : 1;
unsigned int hasChangedState : 1;
unsigned int pexDisabled : 1;
unsigned int doStopAfterHashCheck : 1;
unsigned int statCur : 1;
int8_t statCur;
tr_stat stats[2];
tr_torrent * next;

View File

@ -605,13 +605,12 @@ myHandshakeDoneCB( tr_handshake * handshake,
return;
}
fprintf( stderr, "peer-mgr: torrent [%s] finished a handshake; isConnected is %d\n", t->tor->info.name, isConnected );
fprintf( stderr, "peer-mgr: torrent [%s] finished a handshake. Connected? %s.\n", t->tor->info.name, (isConnected?"yes":"no") );
/* if we couldn't connect or were snubbed,
* the peer's probably not worth remembering. */
if( !ok ) {
tr_peer * peer = getExistingPeer( t, in_addr );
fprintf( stderr, "peer-mgr: torrent [%s] got a bad one, and you know what? fuck them.\n", t->tor->info.name );
tr_peerIoFree( io );
--manager->connectionCount;
if( peer ) {

View File

@ -169,9 +169,9 @@ void tr_sharedSetPort( tr_shared * s, int port )
tr_sharedUnlock( s );
}
int tr_sharedGetPublicPort( tr_shared * s )
int
tr_sharedGetPublicPort( const tr_shared * s )
{
fprintf( stderr, "%s:%d tr_sharedGetPublicPort returning %d\n", __FILE__, __LINE__, (int)s->publicPort );
return s->publicPort;
}
@ -194,9 +194,9 @@ void tr_sharedTraversalEnable( tr_shared * s, int enable )
}
}
int tr_sharedTraversalStatus( tr_shared * s )
int tr_sharedTraversalStatus( const tr_shared * s )
{
int statuses[] = {
const int statuses[] = {
TR_NAT_TRAVERSAL_MAPPED,
TR_NAT_TRAVERSAL_MAPPING,
TR_NAT_TRAVERSAL_UNMAPPING,

View File

@ -54,7 +54,7 @@ void tr_sharedUnlock ( tr_shared * );
* should be called with the shared lock held.
**********************************************************************/
void tr_sharedSetPort ( tr_shared *, int port );
int tr_sharedGetPublicPort ( tr_shared * s );
int tr_sharedGetPublicPort ( const tr_shared * s );
/***********************************************************************
* tr_sharedTraversalEnable, tr_sharedTraversalStatus
@ -63,7 +63,7 @@ int tr_sharedGetPublicPort ( tr_shared * s );
* be called with the shared lock held.
**********************************************************************/
void tr_sharedTraversalEnable ( tr_shared *, int enable );
int tr_sharedTraversalStatus ( tr_shared * );
int tr_sharedTraversalStatus ( const tr_shared * );
#endif

View File

@ -274,6 +274,11 @@ recheckDoneCB( tr_torrent * tor )
{
recheckCpState( tor );
if( tor->doStopAfterHashCheck ) {
tor->doStopAfterHashCheck = 0;
tr_torrentStop( tor );
}
if( tor->runStatus == TR_RUN_RUNNING )
tr_torrentStartImpl( tor );
}
@ -732,7 +737,7 @@ tr_torrentStat( tr_torrent * tor )
tr_torrentLock( tor );
tor->statCur = ( tor->statCur + 1 ) % 2;
tor->statCur = !tor->statCur;
s = &tor->stats[tor->statCur];
s->error = tor->error;
@ -1059,15 +1064,14 @@ tr_torrentStopImpl( void * vtor )
{
case TR_RUN_CHECKING_WAIT:
case TR_RUN_CHECKING:
tor->doStopAfterHashCheck = 1;
tr_ioRecheckRemove( tor );
tr_torrentStop( tor );
break;
case TR_RUN_RUNNING:
saveFastResumeNow( tor );
tr_peerMgrStopTorrent( tor->handle->peerMgr, tor->info.hash );
tor->runStatus = TR_RUN_STOPPING;
tor->stopDate = tr_date( );
tr_trackerStop( tor->tracker );
tr_ioClose( tor );
break;
@ -1089,7 +1093,6 @@ tr_torrentClose( tr_torrent * tor )
{
tor->runStatusToSave = tor->runStatus;
tor->runStatusToSaveIsSet = TRUE;
tor->dieFlag = TRUE;
tr_torrentStop( tor );
tr_timerNew( tor->handle, freeWhenStopped, tor, 250 );
}