diff --git a/libtorrent/include/libtorrent/ptime.hpp b/libtorrent/include/libtorrent/ptime.hpp index cbbe1dcf..444bbb67 100644 --- a/libtorrent/include/libtorrent/ptime.hpp +++ b/libtorrent/include/libtorrent/ptime.hpp @@ -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 // 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 // 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 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 { 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) diff --git a/libtorrent/include/libtorrent/time.hpp b/libtorrent/include/libtorrent/time.hpp index 4285a09a..1b3382cb 100644 --- a/libtorrent/include/libtorrent/time.hpp +++ b/libtorrent/include/libtorrent/time.hpp @@ -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. // 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. // .. 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 diff --git a/libtorrent/src/disk_io_thread.cpp b/libtorrent/src/disk_io_thread.cpp index 59eeac9e..a866aa66 100644 --- a/libtorrent/src/disk_io_thread.cpp +++ b/libtorrent/src/disk_io_thread.cpp @@ -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; diff --git a/libtorrent/src/kademlia/traversal_algorithm.cpp b/libtorrent/src/kademlia/traversal_algorithm.cpp index 116e7718..0248d31c 100644 --- a/libtorrent/src/kademlia/traversal_algorithm.cpp +++ b/libtorrent/src/kademlia/traversal_algorithm.cpp @@ -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; } diff --git a/libtorrent/src/time.cpp b/libtorrent/src/time.cpp index 84b1855d..bea93856 100644 --- a/libtorrent/src/time.cpp +++ b/libtorrent/src/time.cpp @@ -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 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 { 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 { 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 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 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)); diff --git a/libtorrent/src/tracker_manager.cpp b/libtorrent/src/tracker_manager.cpp index 91e8cfe9..60eef590 100644 --- a/libtorrent/src/tracker_manager.cpp +++ b/libtorrent/src/tracker_manager.cpp @@ -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");