diff --git a/ChangeLog b/ChangeLog index e47694548..dcf33aca8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 0.16 release + * support torrents with more than 262000 pieces * make tracker back-off configurable * don't restart the swarm after downloading metadata from magnet links * lower the default tracker retry intervals diff --git a/include/libtorrent/config.hpp b/include/libtorrent/config.hpp index 20966a9c6..8d0901d87 100644 --- a/include/libtorrent/config.hpp +++ b/include/libtorrent/config.hpp @@ -399,6 +399,12 @@ inline int snprintf(char* buf, int len, char const* fmt, ...) #endif #endif +// if set to true, piece picker will use less RAM +// but only support up to ~260000 pieces in a torrent +#ifndef TORRENT_COMPACT_PICKER +#define TORRENT_COMPACT_PICKER 0 +#endif + #ifndef TORRENT_USE_I2P #define TORRENT_USE_I2P 1 #endif diff --git a/include/libtorrent/piece_picker.hpp b/include/libtorrent/piece_picker.hpp index 828bc1ed8..34911014a 100644 --- a/include/libtorrent/piece_picker.hpp +++ b/include/libtorrent/piece_picker.hpp @@ -387,11 +387,15 @@ namespace libtorrent // the number of peers that has this piece // (availability) - unsigned peer_count : 9; +#if TORRENT_COMPACT_PICKER + boost::uint32_t peer_count : 9; +#else + boost::uint32_t peer_count : 16; +#endif // is 1 if the piece is marked as being downloaded - unsigned downloading : 1; + boost::uint32_t downloading : 1; // set when downloading, but no free blocks to request left - unsigned full : 1; + boost::uint32_t full : 1; // is 0 if the piece is filtered (not to be downloaded) // 1 is normal priority (default) // 2 is higher priority than pieces at the same availability level @@ -399,20 +403,32 @@ namespace libtorrent // 4 is higher priority than partial pieces // 5 and 6 same priority as availability 1 (ignores availability) // 7 is maximum priority (ignores availability) - unsigned piece_priority : 3; + boost::uint32_t piece_priority : 3; // index in to the piece_info vector - unsigned index : 18; +#if TORRENT_COMPACT_PICKER + boost::uint32_t index : 18; +#else + boost::uint32_t index; +#endif enum { // index is set to this to indicate that we have the // piece. There is no entry for the piece in the // buckets if this is the case. +#if TORRENT_COMPACT_PICKER we_have_index = 0x3ffff, +#else + we_have_index = 0xffffffff, +#endif // the priority value that means the piece is filtered filter_priority = 0, // the max number the peer count can hold +#if TORRENT_COMPACT_PICKER max_peer_count = 0x1ff +#else + max_peer_count = 0xffff +#endif }; bool have() const { return index == we_have_index; } @@ -469,7 +485,11 @@ namespace libtorrent private: +#if TORRENT_COMPACT_PICKER BOOST_STATIC_ASSERT(sizeof(piece_pos) == sizeof(char) * 4); +#else + BOOST_STATIC_ASSERT(sizeof(piece_pos) == sizeof(char) * 8); +#endif void update_pieces() const; diff --git a/src/piece_picker.cpp b/src/piece_picker.cpp index d8a83995d..512f65a2c 100644 --- a/src/piece_picker.cpp +++ b/src/piece_picker.cpp @@ -269,7 +269,11 @@ namespace libtorrent void piece_picker::check_invariant(const torrent* t) const { +#if TORRENT_COMPACT_PICKER TORRENT_ASSERT(sizeof(piece_pos) == 4); +#else + TORRENT_ASSERT(sizeof(piece_pos) == 8); +#endif TORRENT_ASSERT(m_num_have >= 0); TORRENT_ASSERT(m_num_have_filtered >= 0); TORRENT_ASSERT(m_num_filtered >= 0);