(trunk libT) #3950 "use libevent's cached gettimeofday() value when appropriate" -- fixed.

This commit is contained in:
Jordan Lee 2011-01-29 18:59:23 +00:00
parent 5b23aae320
commit 4fbd6d8b19
4 changed files with 50 additions and 5 deletions

View File

@ -86,6 +86,7 @@ struct tr_datatype
size_t length;
};
/***
****
***/
@ -99,7 +100,7 @@ didWriteWrapper( tr_peerIo * io, unsigned int bytes_transferred )
const unsigned int payload = MIN( next->length, bytes_transferred );
const unsigned int overhead = guessPacketOverhead( payload );
const uint64_t now = tr_time_msec( );
const uint64_t now = tr_sessionGetTimeMsec( io->session );
tr_bandwidthUsed( &io->bandwidth, TR_UP, payload, next->isPieceData, now );
@ -139,6 +140,8 @@ canReadWrapper( tr_peerIo * io )
/* try to consume the input buffer */
if( io->canRead )
{
const uint64_t now = tr_sessionGetTimeMsec( io->session );
tr_sessionLock( session );
while( !done && !err )
@ -148,7 +151,6 @@ canReadWrapper( tr_peerIo * io )
const int ret = io->canRead( io, io->userData, &piece );
const size_t used = oldLen - evbuffer_get_length( io->inbuf );
const unsigned int overhead = guessPacketOverhead( used );
const uint64_t now = tr_time_msec( );
assert( tr_isPeerIo( io ) );

View File

@ -2750,12 +2750,12 @@ rechokeUploads( Torrent * t, const uint64_t now )
static void
rechokePulse( int foo UNUSED, short bar UNUSED, void * vmgr )
{
uint64_t now;
tr_torrent * tor = NULL;
tr_peerMgr * mgr = vmgr;
const uint64_t now = tr_sessionGetTimeMsec( mgr->session );
managerLock( mgr );
now = tr_time_msec( );
while(( tor = tr_torrentNext( mgr->session, tor ))) {
if( tor->isRunning ) {
rechokeUploads( tor->torrentPeers, now );
@ -3113,7 +3113,7 @@ reconnectPulse( int foo UNUSED, short bar UNUSED, void * vmgr )
tr_torrent * tor;
tr_peerMgr * mgr = vmgr;
const time_t now_sec = tr_time( );
const uint64_t now_msec = tr_time_msec( );
const uint64_t now_msec = tr_sessionGetTimeMsec( mgr->session );
/**
*** enforce the per-session and per-torrent peer limits

View File

@ -2558,3 +2558,36 @@ tr_sessionSetWebConfigFunc( tr_session * session, void (*func)(tr_session*, void
{
session->curl_easy_config_func = func;
}
/***
****
***/
uint64_t
tr_sessionGetTimeMsec( tr_session * session )
{
struct timeval tv;
if( event_base_gettimeofday_cached( session->event_base, &tv ) )
{
return tr_time_msec( );
}
else
{
/* event_base_gettimeofday_cached() might be implemented using
clock_gettime(CLOCK_MONOTONIC), so calculate the offset to
real time... */
static uint64_t offset;
static tr_bool offset_calculated = FALSE;
const uint64_t val = (uint64_t) tv.tv_sec * 1000 + ( tv.tv_usec / 1000 );
if( !offset_calculated )
{
offset = tr_time_msec() - val;
offset_calculated = TRUE;
}
return val + offset;
}
}

View File

@ -305,4 +305,14 @@ tr_bool tr_sessionGetActiveSpeedLimit_Bps( const tr_session * session,
int * setme );
/**
* Tries to use libevent's cached timeval so we can avoid excessive calls
* to gettimeofday().
*
* This isn't for all uses, but should be reasonably accurate when called
* near the beginning of a libevent callback.
*/
uint64_t tr_sessionGetTimeMsec( tr_session * session );
#endif