mirror of
https://github.com/transmission/transmission
synced 2025-02-21 13:46:52 +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:
parent
87e78816ad
commit
8aa0f36a37
4 changed files with 82 additions and 89 deletions
|
@ -1956,6 +1956,7 @@ tr_announcerStats( const tr_torrent * torrent,
|
||||||
const time_t now = tr_time( );
|
const time_t now = tr_time( );
|
||||||
|
|
||||||
assert( tr_isTorrent( torrent ) );
|
assert( tr_isTorrent( torrent ) );
|
||||||
|
assert( tr_torrentIsLocked( torrent ) );
|
||||||
|
|
||||||
/* count the trackers... */
|
/* count the trackers... */
|
||||||
for( i=n=0, tierCount=tr_ptrArraySize( &torrent->tiers->tiers ); i<tierCount; ++i ) {
|
for( i=n=0, tierCount=tr_ptrArraySize( &torrent->tiers->tiers ); i<tierCount; ++i ) {
|
||||||
|
|
|
@ -2065,15 +2065,15 @@ tr_peerMgrStartTorrent( tr_torrent * tor )
|
||||||
{
|
{
|
||||||
Torrent * t = tor->torrentPeers;
|
Torrent * t = tor->torrentPeers;
|
||||||
|
|
||||||
assert( t != NULL );
|
assert( tr_isTorrent( tor ) );
|
||||||
managerLock( t->manager );
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
|
|
||||||
ensureMgrTimersExist( t->manager );
|
ensureMgrTimersExist( t->manager );
|
||||||
|
|
||||||
t->isRunning = TRUE;
|
t->isRunning = TRUE;
|
||||||
t->maxPeers = t->tor->maxConnectedPeers;
|
t->maxPeers = t->tor->maxConnectedPeers;
|
||||||
|
|
||||||
rechokePulse( 0, 0, t->manager );
|
rechokePulse( 0, 0, t->manager );
|
||||||
managerUnlock( t->manager );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2081,8 +2081,6 @@ stopTorrent( Torrent * t )
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
assert( torrentIsLocked( t ) );
|
|
||||||
|
|
||||||
t->isRunning = FALSE;
|
t->isRunning = FALSE;
|
||||||
|
|
||||||
/* disconnect the peers. */
|
/* disconnect the peers. */
|
||||||
|
@ -2099,38 +2097,30 @@ stopTorrent( Torrent * t )
|
||||||
void
|
void
|
||||||
tr_peerMgrStopTorrent( tr_torrent * tor )
|
tr_peerMgrStopTorrent( tr_torrent * tor )
|
||||||
{
|
{
|
||||||
Torrent * t = tor->torrentPeers;
|
assert( tr_isTorrent( tor ) );
|
||||||
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
|
|
||||||
managerLock( t->manager );
|
stopTorrent( tor->torrentPeers );
|
||||||
|
|
||||||
stopTorrent( t );
|
|
||||||
|
|
||||||
managerUnlock( t->manager );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tr_peerMgrAddTorrent( tr_peerMgr * manager,
|
tr_peerMgrAddTorrent( tr_peerMgr * manager, tr_torrent * tor )
|
||||||
tr_torrent * tor )
|
|
||||||
{
|
{
|
||||||
managerLock( manager );
|
assert( tr_isTorrent( tor ) );
|
||||||
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
assert( tor );
|
|
||||||
assert( tor->torrentPeers == NULL );
|
assert( tor->torrentPeers == NULL );
|
||||||
|
|
||||||
tor->torrentPeers = torrentConstructor( manager, tor );
|
tor->torrentPeers = torrentConstructor( manager, tor );
|
||||||
|
|
||||||
managerUnlock( manager );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tr_peerMgrRemoveTorrent( tr_torrent * tor )
|
tr_peerMgrRemoveTorrent( tr_torrent * tor )
|
||||||
{
|
{
|
||||||
tr_torrentLock( tor );
|
assert( tr_isTorrent( tor ) );
|
||||||
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
|
|
||||||
stopTorrent( tor->torrentPeers );
|
stopTorrent( tor->torrentPeers );
|
||||||
torrentDestructor( tor->torrentPeers );
|
torrentDestructor( tor->torrentPeers );
|
||||||
|
|
||||||
tr_torrentUnlock( tor );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2172,38 +2162,35 @@ tr_bitfield*
|
||||||
tr_peerMgrGetAvailable( const tr_torrent * tor )
|
tr_peerMgrGetAvailable( const tr_torrent * tor )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int peerCount;
|
|
||||||
Torrent * t = tor->torrentPeers;
|
Torrent * t = tor->torrentPeers;
|
||||||
const tr_peer ** peers;
|
const int peerCount = tr_ptrArraySize( &t->peers );
|
||||||
tr_bitfield * pieces;
|
const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase( &t->peers );
|
||||||
managerLock( t->manager );
|
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 )
|
for( i=0; i<peerCount; ++i )
|
||||||
tr_bitsetOr( pieces, &peers[i]->have );
|
tr_bitsetOr( pieces, &peers[i]->have );
|
||||||
|
|
||||||
managerUnlock( t->manager );
|
|
||||||
return pieces;
|
return pieces;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tr_peerMgrTorrentStats( tr_torrent * tor,
|
tr_peerMgrTorrentStats( tr_torrent * tor,
|
||||||
int * setmePeersKnown,
|
int * setmePeersKnown,
|
||||||
int * setmePeersConnected,
|
int * setmePeersConnected,
|
||||||
int * setmeSeedsConnected,
|
int * setmeSeedsConnected,
|
||||||
int * setmeWebseedsSendingToUs,
|
int * setmeWebseedsSendingToUs,
|
||||||
int * setmePeersSendingToUs,
|
int * setmePeersSendingToUs,
|
||||||
int * setmePeersGettingFromUs,
|
int * setmePeersGettingFromUs,
|
||||||
int * setmePeersFrom )
|
int * setmePeersFrom )
|
||||||
{
|
{
|
||||||
int i, size;
|
int i, size;
|
||||||
const Torrent * t = tor->torrentPeers;
|
const Torrent * t = tor->torrentPeers;
|
||||||
const tr_peer ** peers;
|
const tr_peer ** peers;
|
||||||
const tr_webseed ** webseeds;
|
const tr_webseed ** webseeds;
|
||||||
|
|
||||||
managerLock( t->manager );
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
|
|
||||||
peers = (const tr_peer **) tr_ptrArrayBase( &t->peers );
|
peers = (const tr_peer **) tr_ptrArrayBase( &t->peers );
|
||||||
size = tr_ptrArraySize( &t->peers );
|
size = tr_ptrArraySize( &t->peers );
|
||||||
|
@ -2245,8 +2232,6 @@ tr_peerMgrTorrentStats( tr_torrent * tor,
|
||||||
for( i=0; i<size; ++i )
|
for( i=0; i<size; ++i )
|
||||||
if( tr_webseedIsActive( webseeds[i] ) )
|
if( tr_webseedIsActive( webseeds[i] ) )
|
||||||
++*setmeWebseedsSendingToUs;
|
++*setmeWebseedsSendingToUs;
|
||||||
|
|
||||||
managerUnlock( t->manager );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -2271,21 +2256,17 @@ tr_peerMgrGetWebseedSpeed_Bps( const tr_torrent * tor, uint64_t now )
|
||||||
double*
|
double*
|
||||||
tr_peerMgrWebSpeeds_KBps( const tr_torrent * tor )
|
tr_peerMgrWebSpeeds_KBps( const tr_torrent * tor )
|
||||||
{
|
{
|
||||||
const Torrent * t = tor->torrentPeers;
|
|
||||||
const tr_webseed ** webseeds;
|
|
||||||
int i;
|
int i;
|
||||||
int webseedCount;
|
const Torrent * t = tor->torrentPeers;
|
||||||
double * ret;
|
const int webseedCount = tr_ptrArraySize( &t->webseeds );
|
||||||
uint64_t now;
|
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 );
|
assert( tr_isTorrent( tor ) );
|
||||||
managerLock( t->manager );
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
|
assert( t->manager != NULL );
|
||||||
webseeds = (const tr_webseed**) tr_ptrArrayBase( &t->webseeds );
|
|
||||||
webseedCount = tr_ptrArraySize( &t->webseeds );
|
|
||||||
assert( webseedCount == tor->info.webseedCount );
|
assert( webseedCount == tor->info.webseedCount );
|
||||||
ret = tr_new0( double, webseedCount );
|
|
||||||
now = tr_time_msec( );
|
|
||||||
|
|
||||||
for( i=0; i<webseedCount; ++i ) {
|
for( i=0; i<webseedCount; ++i ) {
|
||||||
int Bps;
|
int Bps;
|
||||||
|
@ -2295,7 +2276,6 @@ tr_peerMgrWebSpeeds_KBps( const tr_torrent * tor )
|
||||||
ret[i] = -1.0;
|
ret[i] = -1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
managerUnlock( t->manager );
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2307,24 +2287,19 @@ tr_peerGetPieceSpeed_Bps( const tr_peer * peer, uint64_t now, tr_direction direc
|
||||||
|
|
||||||
|
|
||||||
struct tr_peer_stat *
|
struct tr_peer_stat *
|
||||||
tr_peerMgrPeerStats( const tr_torrent * tor,
|
tr_peerMgrPeerStats( const tr_torrent * tor, int * setmeCount )
|
||||||
int * setmeCount )
|
|
||||||
{
|
{
|
||||||
int i, size;
|
int i;
|
||||||
const Torrent * t = tor->torrentPeers;
|
const Torrent * t = tor->torrentPeers;
|
||||||
const tr_peer ** peers;
|
const int size = tr_ptrArraySize( &t->peers );
|
||||||
tr_peer_stat * ret;
|
const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase( &t->peers );
|
||||||
uint64_t now_msec;
|
const uint64_t now_msec = tr_time_msec( );
|
||||||
time_t now;
|
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 );
|
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 )
|
for( i=0; i<size; ++i )
|
||||||
{
|
{
|
||||||
|
@ -2376,7 +2351,6 @@ tr_peerMgrPeerStats( const tr_torrent * tor,
|
||||||
|
|
||||||
*setmeCount = size;
|
*setmeCount = size;
|
||||||
|
|
||||||
managerUnlock( t->manager );
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2388,24 +2362,17 @@ void
|
||||||
tr_peerMgrClearInterest( tr_torrent * tor )
|
tr_peerMgrClearInterest( tr_torrent * tor )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Torrent * t;
|
Torrent * t = tor->torrentPeers;
|
||||||
int peerCount;
|
const int peerCount = tr_ptrArraySize( &t->peers );
|
||||||
|
|
||||||
assert( tr_isTorrent( tor ) );
|
assert( tr_isTorrent( tor ) );
|
||||||
|
assert( tr_torrentIsLocked( tor ) );
|
||||||
t = tor->torrentPeers;
|
|
||||||
|
|
||||||
torrentLock( t );
|
|
||||||
|
|
||||||
peerCount = tr_ptrArraySize( &t->peers );
|
|
||||||
|
|
||||||
for( i=0; i<peerCount; ++i )
|
for( i=0; i<peerCount; ++i )
|
||||||
{
|
{
|
||||||
const tr_peer * peer = tr_ptrArrayNth( &t->peers, i );
|
const tr_peer * peer = tr_ptrArrayNth( &t->peers, i );
|
||||||
tr_peerMsgsSetInterested( peer->msgs, FALSE );
|
tr_peerMsgsSetInterested( peer->msgs, FALSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
torrentUnlock( t );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do we still want this piece and does the peer have it? */
|
/* do we still want this piece and does the peer have it? */
|
||||||
|
|
|
@ -1398,40 +1398,56 @@ tr_torrentFilesFree( tr_file_stat * files,
|
||||||
double*
|
double*
|
||||||
tr_torrentWebSpeeds_KBps( const tr_torrent * tor )
|
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_peer_stat *
|
||||||
tr_torrentPeers( const tr_torrent * tor,
|
tr_torrentPeers( const tr_torrent * tor, int * peerCount )
|
||||||
int * peerCount )
|
|
||||||
{
|
{
|
||||||
tr_peer_stat * ret = NULL;
|
tr_peer_stat * ret = NULL;
|
||||||
|
|
||||||
if( tr_isTorrent( tor ) )
|
if( tr_isTorrent( tor ) )
|
||||||
|
{
|
||||||
|
tr_torrentLock( tor );
|
||||||
ret = tr_peerMgrPeerStats( tor, peerCount );
|
ret = tr_peerMgrPeerStats( tor, peerCount );
|
||||||
|
tr_torrentUnlock( tor );
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tr_torrentPeersFree( tr_peer_stat * peers,
|
tr_torrentPeersFree( tr_peer_stat * peers, int peerCount UNUSED )
|
||||||
int peerCount UNUSED )
|
|
||||||
{
|
{
|
||||||
tr_free( peers );
|
tr_free( peers );
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_tracker_stat *
|
tr_tracker_stat *
|
||||||
tr_torrentTrackers( const tr_torrent * torrent,
|
tr_torrentTrackers( const tr_torrent * torrent, int * setmeTrackerCount )
|
||||||
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
|
void
|
||||||
tr_torrentTrackersFree( tr_tracker_stat * trackers,
|
tr_torrentTrackersFree( tr_tracker_stat * trackers, int trackerCount )
|
||||||
int trackerCount )
|
|
||||||
{
|
{
|
||||||
tr_announcerStatsFree( trackers, trackerCount );
|
tr_announcerStatsFree( trackers, trackerCount );
|
||||||
}
|
}
|
||||||
|
@ -1722,6 +1738,8 @@ stopTorrent( void * vtor )
|
||||||
|
|
||||||
assert( tr_isTorrent( tor ) );
|
assert( tr_isTorrent( tor ) );
|
||||||
|
|
||||||
|
tr_torrentLock( tor );
|
||||||
|
|
||||||
tr_verifyRemove( tor );
|
tr_verifyRemove( tor );
|
||||||
tr_peerMgrStopTorrent( tor );
|
tr_peerMgrStopTorrent( tor );
|
||||||
tr_announcerTorrentStopped( tor );
|
tr_announcerTorrentStopped( tor );
|
||||||
|
@ -1731,6 +1749,8 @@ stopTorrent( void * vtor )
|
||||||
|
|
||||||
if( !tor->isDeleting )
|
if( !tor->isDeleting )
|
||||||
tr_torrentSave( tor );
|
tr_torrentSave( tor );
|
||||||
|
|
||||||
|
tr_torrentUnlock( tor );
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -297,6 +297,11 @@ static inline void tr_torrentLock( const tr_torrent * tor )
|
||||||
tr_sessionLock( tor->session );
|
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 )
|
static inline void tr_torrentUnlock( const tr_torrent * tor )
|
||||||
{
|
{
|
||||||
tr_sessionUnlock( tor->session );
|
tr_sessionUnlock( tor->session );
|
||||||
|
|
Loading…
Reference in a new issue