Browse Source

update time.cpp/ptime from upstream (r10083) trying to fix non-monotonic time issues with win32.

still one assert from disk_io_thread must be commented out to avoid aborting.
miguelfreitas
Miguel Freitas 11 years ago
parent
commit
7240fee4e9
  1. 23
      libtorrent/include/libtorrent/ptime.hpp
  2. 33
      libtorrent/include/libtorrent/time.hpp
  3. 2
      libtorrent/src/disk_io_thread.cpp
  4. 2
      libtorrent/src/kademlia/traversal_algorithm.cpp
  5. 42
      libtorrent/src/time.cpp
  6. 4
      libtorrent/src/tracker_manager.cpp

23
libtorrent/include/libtorrent/ptime.hpp

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
/*
Copyright (c) 2009-2012, Arvid Norberg
Copyright (c) 2009-2014, Arvid Norberg
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -57,14 +57,21 @@ namespace libtorrent @@ -57,14 +57,21 @@ namespace libtorrent
// libtorrent time_duration type
struct TORRENT_EXPORT time_duration
{
// hidden
time_duration() {}
// all operators have the same semantics as a 64 bit signed integer
time_duration operator/(int rhs) const { return time_duration(diff / rhs); }
explicit time_duration(boost::int64_t d) : diff(d) {}
time_duration& operator-=(time_duration const& c) { diff -= c.diff; return *this; }
time_duration& operator+=(time_duration const& c) { diff += c.diff; return *this; }
time_duration& operator-=(time_duration const& c)
{ diff -= c.diff; return *this; }
time_duration& operator+=(time_duration const& c)
{ diff += c.diff; return *this; }
time_duration& operator*=(int v) { diff *= v; return *this; }
time_duration operator+(time_duration const& c) { return time_duration(diff + c.diff); }
time_duration operator-(time_duration const& c) { return time_duration(diff - c.diff); }
time_duration operator+(time_duration const& c)
{ return time_duration(diff + c.diff); }
time_duration operator-(time_duration const& c)
{ return time_duration(diff - c.diff); }
// internal
boost::int64_t diff;
@ -73,8 +80,11 @@ namespace libtorrent @@ -73,8 +80,11 @@ namespace libtorrent
// This type represents a point in time.
struct TORRENT_EXPORT ptime
{
// hidden
ptime() {}
explicit ptime(boost::uint64_t t): time(t) {}
// these operators have the same semantics as signed 64 bit integers
ptime& operator+=(time_duration rhs) { time += rhs.diff; return *this; }
ptime& operator-=(time_duration rhs) { time -= rhs.diff; return *this; }
@ -82,8 +92,10 @@ namespace libtorrent @@ -82,8 +92,10 @@ namespace libtorrent
boost::uint64_t time;
};
// returns true of the time duration is less than 0
inline bool is_negative(time_duration dt) { return dt.diff < 0; }
// all operators have the same semantics as signed 64 bit integers
inline bool operator>(ptime lhs, ptime rhs)
{ return lhs.time > rhs.time; }
inline bool operator>=(ptime lhs, ptime rhs)
@ -110,7 +122,6 @@ namespace libtorrent @@ -110,7 +122,6 @@ namespace libtorrent
{ return time_duration(boost::int64_t(lhs.diff * rhs)); }
inline time_duration operator*(int lhs, time_duration rhs)
{ return time_duration(boost::int64_t(lhs * rhs.diff)); }
inline time_duration operator-(ptime lhs, ptime rhs)
{ return time_duration(lhs.time - rhs.time); }
inline ptime operator+(ptime lhs, time_duration rhs)

33
libtorrent/include/libtorrent/time.hpp

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
/*
Copyright (c) 2007-2012, Arvid Norberg
Copyright (c) 2007-2014, Arvid Norberg
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -41,7 +41,7 @@ POSSIBILITY OF SUCH DAMAGE. @@ -41,7 +41,7 @@ POSSIBILITY OF SUCH DAMAGE.
// OVERVIEW
//
// This section contains fundamental time types used internall by
// This section contains fundamental time types used internally by
// libtorrent and exposed through various places in the API. The two
// basic types are ``ptime`` and ``time_duration``. The first represents
// a point in time and the second the difference between two points
@ -56,28 +56,41 @@ POSSIBILITY OF SUCH DAMAGE. @@ -56,28 +56,41 @@ POSSIBILITY OF SUCH DAMAGE.
// .. note::
// In a future version of libtorrent, these types will be replaced
// by the standard timer types from ``std::chrono``.
//
namespace libtorrent
{
TORRENT_EXTRA_EXPORT char const* time_now_string();
std::string log_time();
// returns the current time, as represented by ptime. The
// resolution of this timer is about 100 ms.
TORRENT_EXPORT ptime const& time_now();
// returns the current time as represented by ptime. This is
// more expensive than time_now(), but provides as high resolution
// as the operating system can provide.
TORRENT_EXPORT ptime time_now_hires();
// the earliest and latest possible time points
// representable by ptime.
TORRENT_EXPORT ptime min_time();
TORRENT_EXPORT ptime max_time();
#if defined TORRENT_USE_BOOST_DATE_TIME || defined TORRENT_USE_QUERY_PERFORMANCE_TIMER
TORRENT_EXPORT time_duration seconds(int s);
TORRENT_EXPORT time_duration milliseconds(int s);
TORRENT_EXPORT time_duration microsec(int s);
TORRENT_EXPORT time_duration minutes(int s);
TORRENT_EXPORT time_duration hours(int s);
TORRENT_EXPORT int total_seconds(time_duration td);
TORRENT_EXPORT int total_milliseconds(time_duration td);
// returns a time_duration representing the specified number of seconds, milliseconds
// microseconds, minutes and hours.
TORRENT_EXPORT time_duration seconds(boost::int64_t s);
TORRENT_EXPORT time_duration milliseconds(boost::int64_t s);
TORRENT_EXPORT time_duration microsec(boost::int64_t s);
TORRENT_EXPORT time_duration minutes(boost::int64_t s);
TORRENT_EXPORT time_duration hours(boost::int64_t s);
// returns the number of seconds, milliseconds and microseconds
// a time_duration represents.
TORRENT_EXPORT boost::int64_t total_seconds(time_duration td);
TORRENT_EXPORT boost::int64_t total_milliseconds(time_duration td);
TORRENT_EXPORT boost::int64_t total_microseconds(time_duration td);
#elif TORRENT_USE_CLOCK_GETTIME || TORRENT_USE_SYSTEM_TIME || TORRENT_USE_ABSOLUTE_TIME

2
libtorrent/src/disk_io_thread.cpp

@ -2392,7 +2392,7 @@ namespace libtorrent @@ -2392,7 +2392,7 @@ namespace libtorrent
for (int processed = 0; processed < 4 * 1024 * 1024; processed += piece_size)
{
ptime now = time_now_hires();
TORRENT_ASSERT(now >= m_last_file_check);
//TORRENT_ASSERT(now >= m_last_file_check);
// this happens sometimes on windows for some reason
if (now < m_last_file_check) now = m_last_file_check;

2
libtorrent/src/kademlia/traversal_algorithm.cpp

@ -449,7 +449,7 @@ void traversal_algorithm::status(dht_lookup& l) @@ -449,7 +449,7 @@ void traversal_algorithm::status(dht_lookup& l)
observer& o = **i;
if (o.flags & observer::flag_queried)
{
last_sent = (std::min)(last_sent, total_seconds(now - o.sent()));
last_sent = (std::min)(last_sent, int(total_seconds(now - o.sent())));
if (o.has_short_timeout()) ++l.first_timeout;
continue;
}

42
libtorrent/src/time.cpp

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
/*
Copyright (c) 2009-2012, Arvid Norberg
Copyright (c) 2009-2014, Arvid Norberg
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -58,12 +58,6 @@ namespace libtorrent @@ -58,12 +58,6 @@ namespace libtorrent
char const* time_now_string()
{
// time_t t = std::time(0);
// tm* timeinfo = std::localtime(&t);
// static char str[200];
// std::strftime(str, 200, "%b %d %X", timeinfo);
// return str;
static const ptime start = time_now_hires();
static char ret[200];
int t = total_milliseconds(time_now_hires() - start);
@ -82,7 +76,7 @@ namespace libtorrent @@ -82,7 +76,7 @@ namespace libtorrent
{
static const ptime start = time_now_hires();
char ret[200];
snprintf(ret, sizeof(ret), "%"PRId64, total_microseconds(time_now_hires() - start));
snprintf(ret, sizeof(ret), "%" PRId64, total_microseconds(time_now_hires() - start));
return ret;
}
}
@ -99,15 +93,15 @@ namespace libtorrent @@ -99,15 +93,15 @@ namespace libtorrent
{ return boost::posix_time::ptime(boost::posix_time::min_date_time); }
ptime max_time()
{ return boost::posix_time::ptime(boost::posix_time::max_date_time); }
time_duration seconds(int s) { return boost::posix_time::seconds(s); }
time_duration milliseconds(int s) { return boost::posix_time::milliseconds(s); }
time_duration microsec(int s) { return boost::posix_time::microsec(s); }
time_duration minutes(int s) { return boost::posix_time::minutes(s); }
time_duration hours(int s) { return boost::posix_time::hours(s); }
time_duration seconds(boost::int64_t s) { return boost::posix_time::seconds(s); }
time_duration milliseconds(boost::int64_t s) { return boost::posix_time::milliseconds(s); }
time_duration microsec(boost::int64_t s) { return boost::posix_time::microsec(s); }
time_duration minutes(boost::int64_t s) { return boost::posix_time::minutes(s); }
time_duration hours(boost::int64_t s) { return boost::posix_time::hours(s); }
int total_seconds(time_duration td)
boost::int64_t total_seconds(time_duration td)
{ return td.total_seconds(); }
int total_milliseconds(time_duration td)
boost::int64_t total_milliseconds(time_duration td)
{ return td.total_milliseconds(); }
boost::int64_t total_microseconds(time_duration td)
{ return td.total_microseconds(); }
@ -188,14 +182,14 @@ namespace libtorrent @@ -188,14 +182,14 @@ namespace libtorrent
return ptime(now.QuadPart);
}
int total_seconds(time_duration td)
boost::int64_t total_seconds(time_duration td)
{
return int(performance_counter_to_microseconds(td.diff)
return boost::int64_t(performance_counter_to_microseconds(td.diff)
/ 1000000);
}
int total_milliseconds(time_duration td)
boost::int64_t total_milliseconds(time_duration td)
{
return int(performance_counter_to_microseconds(td.diff)
return boost::uint64_t(performance_counter_to_microseconds(td.diff)
/ 1000);
}
boost::int64_t total_microseconds(time_duration td)
@ -203,26 +197,26 @@ namespace libtorrent @@ -203,26 +197,26 @@ namespace libtorrent
return performance_counter_to_microseconds(td.diff);
}
time_duration microsec(int s)
time_duration microsec(boost::int64_t s)
{
return time_duration(microseconds_to_performance_counter(s));
}
time_duration milliseconds(int s)
time_duration milliseconds(boost::int64_t s)
{
return time_duration(microseconds_to_performance_counter(
s * 1000));
}
time_duration seconds(int s)
time_duration seconds(boost::int64_t s)
{
return time_duration(microseconds_to_performance_counter(
s * 1000000));
}
time_duration minutes(int s)
time_duration minutes(boost::int64_t s)
{
return time_duration(microseconds_to_performance_counter(
s * 1000000 * 60));
}
time_duration hours(int s)
time_duration hours(boost::int64_t s)
{
return time_duration(microseconds_to_performance_counter(
s * 1000000 * 60 * 60));

4
libtorrent/src/tracker_manager.cpp

@ -133,8 +133,8 @@ namespace libtorrent @@ -133,8 +133,8 @@ namespace libtorrent
if (m_completion_timeout > 0)
{
timeout = timeout == 0
? m_completion_timeout - total_seconds(m_read_time - m_start_time)
: (std::min)(m_completion_timeout - total_seconds(m_read_time - m_start_time), timeout);
? int(m_completion_timeout - total_seconds(m_read_time - m_start_time))
: (std::min)(int(m_completion_timeout - total_seconds(m_read_time - m_start_time)), timeout);
}
#if defined TORRENT_ASIO_DEBUGGING
add_outstanding_async("timeout_handler::timeout_callback");

Loading…
Cancel
Save