size_t length;
};
+
/***
****
***/
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 );
/* try to consume the input buffer */
if( io->canRead )
{
+ const uint64_t now = tr_sessionGetTimeMsec( io->session );
+
tr_sessionLock( session );
while( !done && !err )
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 ) );
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 );
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
{
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;
+ }
+}
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