1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-20 13:16:53 +00:00

cleanup of who calls the libtransmission thread locking functions.

In some cases we were calling them from deep inside libtransmission, when they should have been called directly from the public-visible API functions: tr_torrentWebSpeeds_KBps(), tr_torrentPeers(), tr_torrentTrackers().
This commit is contained in:
Jordan Lee 2011-01-18 23:44:36 +00:00
parent 87e78816ad
commit 8aa0f36a37
4 changed files with 82 additions and 89 deletions

View file

@ -1956,6 +1956,7 @@ tr_announcerStats( const tr_torrent * torrent,
const time_t now = tr_time( );
assert( tr_isTorrent( torrent ) );
assert( tr_torrentIsLocked( torrent ) );
/* count the trackers... */
for( i=n=0, tierCount=tr_ptrArraySize( &torrent->tiers->tiers ); i<tierCount; ++i ) {

View file

@ -2065,15 +2065,15 @@ tr_peerMgrStartTorrent( tr_torrent * tor )
{
Torrent * t = tor->torrentPeers;
assert( t != NULL );
managerLock( t->manager );
assert( tr_isTorrent( tor ) );
assert( tr_torrentIsLocked( tor ) );
ensureMgrTimersExist( t->manager );
t->isRunning = TRUE;
t->maxPeers = t->tor->maxConnectedPeers;
rechokePulse( 0, 0, t->manager );
managerUnlock( t->manager );
}
static void
@ -2081,8 +2081,6 @@ stopTorrent( Torrent * t )
{
int i, n;
assert( torrentIsLocked( t ) );
t->isRunning = FALSE;
/* disconnect the peers. */
@ -2099,38 +2097,30 @@ stopTorrent( Torrent * t )
void
tr_peerMgrStopTorrent( tr_torrent * tor )
{
Torrent * t = tor->torrentPeers;
assert( tr_isTorrent( tor ) );
assert( tr_torrentIsLocked( tor ) );
managerLock( t->manager );
stopTorrent( t );
managerUnlock( t->manager );
stopTorrent( tor->torrentPeers );
}
void
tr_peerMgrAddTorrent( tr_peerMgr * manager,
tr_torrent * tor )
tr_peerMgrAddTorrent( tr_peerMgr * manager, tr_torrent * tor )
{
managerLock( manager );
assert( tor );
assert( tr_isTorrent( tor ) );
assert( tr_torrentIsLocked( tor ) );
assert( tor->torrentPeers == NULL );
tor->torrentPeers = torrentConstructor( manager, tor );
managerUnlock( manager );
}
void
tr_peerMgrRemoveTorrent( tr_torrent * tor )
{
tr_torrentLock( tor );
assert( tr_isTorrent( tor ) );
assert( tr_torrentIsLocked( tor ) );
stopTorrent( tor->torrentPeers );
torrentDestructor( tor->torrentPeers );
tr_torrentUnlock( tor );
}
void
@ -2172,38 +2162,35 @@ tr_bitfield*
tr_peerMgrGetAvailable( const tr_torrent * tor )
{
int i;
int peerCount;
Torrent * t = tor->torrentPeers;
const tr_peer ** peers;
tr_bitfield * pieces;
managerLock( t->manager );
const int peerCount = tr_ptrArraySize( &t->peers );
const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase( &t->peers );
tr_bitfield * pieces = tr_bitfieldNew( t->tor->info.pieceCount );
assert( tr_torrentIsLocked( tor ) );
pieces = tr_bitfieldNew( t->tor->info.pieceCount );
peerCount = tr_ptrArraySize( &t->peers );
peers = (const tr_peer**) tr_ptrArrayBase( &t->peers );
for( i=0; i<peerCount; ++i )
tr_bitsetOr( pieces, &peers[i]->have );
managerUnlock( t->manager );
return pieces;
}
void
tr_peerMgrTorrentStats( tr_torrent * tor,
int * setmePeersKnown,
int * setmePeersConnected,
int * setmeSeedsConnected,
int * setmeWebseedsSendingToUs,
int * setmePeersSendingToUs,
int * setmePeersGettingFromUs,
int * setmePeersFrom )
tr_peerMgrTorrentStats( tr_torrent * tor,
int * setmePeersKnown,
int * setmePeersConnected,
int * setmeSeedsConnected,
int * setmeWebseedsSendingToUs,
int * setmePeersSendingToUs,
int * setmePeersGettingFromUs,
int * setmePeersFrom )
{
int i, size;
const Torrent * t = tor->torrentPeers;
const tr_peer ** peers;
const tr_webseed ** webseeds;
managerLock( t->manager );
assert( tr_torrentIsLocked( tor ) );
peers = (const tr_peer **) tr_ptrArrayBase( &t->peers );
size = tr_ptrArraySize( &t->peers );
@ -2245,8 +2232,6 @@ tr_peerMgrTorrentStats( tr_torrent * tor,
for( i=0; i<size; ++i )
if( tr_webseedIsActive( webseeds[i] ) )
++*setmeWebseedsSendingToUs;
managerUnlock( t->manager );
}
int
@ -2271,21 +2256,17 @@ tr_peerMgrGetWebseedSpeed_Bps( const tr_torrent * tor, uint64_t now )
double*
tr_peerMgrWebSpeeds_KBps( const tr_torrent * tor )
{
const Torrent * t = tor->torrentPeers;
const tr_webseed ** webseeds;
int i;
int webseedCount;
double * ret;
uint64_t now;
const Torrent * t = tor->torrentPeers;
const int webseedCount = tr_ptrArraySize( &t->webseeds );
const tr_webseed ** webseeds = (const tr_webseed**) tr_ptrArrayBase( &t->webseeds );
const uint64_t now = tr_time_msec( );
double * ret = tr_new0( double, webseedCount );
assert( t->manager );
managerLock( t->manager );
webseeds = (const tr_webseed**) tr_ptrArrayBase( &t->webseeds );
webseedCount = tr_ptrArraySize( &t->webseeds );
assert( tr_isTorrent( tor ) );
assert( tr_torrentIsLocked( tor ) );
assert( t->manager != NULL );
assert( webseedCount == tor->info.webseedCount );
ret = tr_new0( double, webseedCount );
now = tr_time_msec( );
for( i=0; i<webseedCount; ++i ) {
int Bps;
@ -2295,7 +2276,6 @@ tr_peerMgrWebSpeeds_KBps( const tr_torrent * tor )
ret[i] = -1.0;
}
managerUnlock( t->manager );
return ret;
}
@ -2307,24 +2287,19 @@ tr_peerGetPieceSpeed_Bps( const tr_peer * peer, uint64_t now, tr_direction direc
struct tr_peer_stat *
tr_peerMgrPeerStats( const tr_torrent * tor,
int * setmeCount )
tr_peerMgrPeerStats( const tr_torrent * tor, int * setmeCount )
{
int i, size;
int i;
const Torrent * t = tor->torrentPeers;
const tr_peer ** peers;
tr_peer_stat * ret;
uint64_t now_msec;
time_t now;
const int size = tr_ptrArraySize( &t->peers );
const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase( &t->peers );
const uint64_t now_msec = tr_time_msec( );
const time_t now = tr_time();
tr_peer_stat * ret = tr_new0( tr_peer_stat, size );
assert( tr_isTorrent( tor ) );
assert( tr_torrentIsLocked( tor ) );
assert( t->manager );
managerLock( t->manager );
size = tr_ptrArraySize( &t->peers );
peers = (const tr_peer**) tr_ptrArrayBase( &t->peers );
ret = tr_new0( tr_peer_stat, size );
now_msec = tr_time_msec( );
now = tr_time();
for( i=0; i<size; ++i )
{
@ -2376,7 +2351,6 @@ tr_peerMgrPeerStats( const tr_torrent * tor,
*setmeCount = size;
managerUnlock( t->manager );
return ret;
}
@ -2388,24 +2362,17 @@ void
tr_peerMgrClearInterest( tr_torrent * tor )
{
int i;
Torrent * t;
int peerCount;
Torrent * t = tor->torrentPeers;
const int peerCount = tr_ptrArraySize( &t->peers );
assert( tr_isTorrent( tor ) );
t = tor->torrentPeers;
torrentLock( t );
peerCount = tr_ptrArraySize( &t->peers );
assert( tr_torrentIsLocked( tor ) );
for( i=0; i<peerCount; ++i )
{
const tr_peer * peer = tr_ptrArrayNth( &t->peers, i );
tr_peerMsgsSetInterested( peer->msgs, FALSE );
}
torrentUnlock( t );
}
/* do we still want this piece and does the peer have it? */

View file

@ -1398,40 +1398,56 @@ tr_torrentFilesFree( tr_file_stat * files,
double*
tr_torrentWebSpeeds_KBps( const tr_torrent * tor )
{
return tr_isTorrent( tor ) ? tr_peerMgrWebSpeeds_KBps( tor ) : NULL;
double * ret = NULL;
if( tr_isTorrent( tor ) )
{
tr_torrentLock( tor );
ret = tr_peerMgrWebSpeeds_KBps( tor );
tr_torrentUnlock( tor );
}
return ret;
}
tr_peer_stat *
tr_torrentPeers( const tr_torrent * tor,
int * peerCount )
tr_torrentPeers( const tr_torrent * tor, int * peerCount )
{
tr_peer_stat * ret = NULL;
if( tr_isTorrent( tor ) )
{
tr_torrentLock( tor );
ret = tr_peerMgrPeerStats( tor, peerCount );
tr_torrentUnlock( tor );
}
return ret;
}
void
tr_torrentPeersFree( tr_peer_stat * peers,
int peerCount UNUSED )
tr_torrentPeersFree( tr_peer_stat * peers, int peerCount UNUSED )
{
tr_free( peers );
}
tr_tracker_stat *
tr_torrentTrackers( const tr_torrent * torrent,
int * setmeTrackerCount )
tr_torrentTrackers( const tr_torrent * torrent, int * setmeTrackerCount )
{
assert( tr_isTorrent( torrent ) );
tr_tracker_stat * ret = NULL;
return tr_announcerStats( torrent, setmeTrackerCount );
if( tr_isTorrent( torrent ) )
{
tr_torrentLock( torrent );
ret = tr_announcerStats( torrent, setmeTrackerCount );
tr_torrentUnlock( torrent );
}
return ret;
}
void
tr_torrentTrackersFree( tr_tracker_stat * trackers,
int trackerCount )
tr_torrentTrackersFree( tr_tracker_stat * trackers, int trackerCount )
{
tr_announcerStatsFree( trackers, trackerCount );
}
@ -1722,6 +1738,8 @@ stopTorrent( void * vtor )
assert( tr_isTorrent( tor ) );
tr_torrentLock( tor );
tr_verifyRemove( tor );
tr_peerMgrStopTorrent( tor );
tr_announcerTorrentStopped( tor );
@ -1731,6 +1749,8 @@ stopTorrent( void * vtor )
if( !tor->isDeleting )
tr_torrentSave( tor );
tr_torrentUnlock( tor );
}
void

View file

@ -297,6 +297,11 @@ static inline void tr_torrentLock( const tr_torrent * tor )
tr_sessionLock( tor->session );
}
static inline tr_bool tr_torrentIsLocked( const tr_torrent * tor )
{
return tr_sessionIsLocked( tor->session );
}
static inline void tr_torrentUnlock( const tr_torrent * tor )
{
tr_sessionUnlock( tor->session );