diff --git a/Makefile.am b/Makefile.am index be70d2420..62d1d5dd0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -117,6 +117,7 @@ EXTRA_DIST = \ Jamfile \ Jamroot.jam \ CMakeLists.txt \ + LibtorrentRasterbarConfig.cmake.in \ cmake/Modules/FindLibGcrypt.cmake \ cmake/Modules/GeneratePkgConfig.cmake \ cmake/Modules/ucm_flags.cmake \ diff --git a/bindings/python/src/alert.cpp b/bindings/python/src/alert.cpp index 9b7e77be0..a47ddc8a7 100644 --- a/bindings/python/src/alert.cpp +++ b/bindings/python/src/alert.cpp @@ -91,19 +91,19 @@ list dht_stats_routing_table(dht_stats_alert const& a) dict dht_immutable_item(dht_immutable_item_alert const& alert) { dict d; - d["key"] = alert.target.to_string(); - d["value"] = alert.item.to_string(); + d["key"] = alert.target; + d["value"] = bytes(alert.item.to_string()); return d; } dict dht_mutable_item(dht_mutable_item_alert const& alert) { dict d; - d["key"] = std::string(alert.key.data(), alert.key.size()); - d["value"] = alert.item.to_string(); - d["signature"] = std::string(alert.signature.data(), alert.signature.size()); + d["key"] = bytes(alert.key.data(), alert.key.size()); + d["value"] = bytes(alert.item.to_string()); + d["signature"] = bytes(alert.signature.data(), alert.signature.size()); d["seq"] = alert.seq; - d["salt"] = alert.salt; + d["salt"] = bytes(alert.salt); d["authoritative"] = alert.authoritative; return d; } @@ -112,12 +112,12 @@ dict dht_put_item(dht_put_alert const& alert) { dict d; if (alert.target.is_all_zeros()) { - d["public_key"] = std::string(alert.public_key.data(), alert.public_key.size()); - d["signature"] = std::string(alert.signature.data(), alert.signature.size()); + d["public_key"] = bytes(alert.public_key.data(), alert.public_key.size()); + d["signature"] = bytes(alert.signature.data(), alert.signature.size()); d["seq"] = alert.seq; - d["salt"] = alert.salt; + d["salt"] = bytes(alert.salt); } else { - d["target"] = alert.target.to_string(); + d["target"] = alert.target; } return d; } diff --git a/bindings/python/src/bytes.hpp b/bindings/python/src/bytes.hpp index 64ce4232a..27611c017 100644 --- a/bindings/python/src/bytes.hpp +++ b/bindings/python/src/bytes.hpp @@ -9,7 +9,7 @@ struct bytes { - bytes(char const* s, int len): arr(s, len) {} + bytes(char const* s, std::size_t len): arr(s, len) {} bytes(std::string const& s): arr(s) {} bytes(std::string&& s): arr(std::move(s)) {} bytes(bytes const&) = default; diff --git a/docs/gen_reference_doc.py b/docs/gen_reference_doc.py index c489f366e..8ff549970 100644 --- a/docs/gen_reference_doc.py +++ b/docs/gen_reference_doc.py @@ -34,6 +34,8 @@ overviews = {} # maps names -> URL symbols = {} +global orphaned_export + # some files that need pre-processing to turn symbols into # links into the reference documentation preprocess_rst = \ @@ -283,6 +285,9 @@ def parse_function(lno, lines, filename): end_paren = 0 signature = '' + global orphaned_export + orphaned_export = False + while lno < len(lines): line = lines[lno].strip() lno += 1 @@ -358,6 +363,9 @@ def parse_class(lno, lines, filename): name = decl.split(':')[0].replace('class ', '').replace('struct ', '').replace('final', '').strip() + global orphaned_export + orphaned_export = False + while lno < len(lines): line = lines[lno].strip() lno += 1 @@ -695,8 +703,16 @@ for filename in files: blanks = 0 lno = 0 + global orphaned_export + orphaned_export = False + while lno < len(lines): line = lines[lno].strip() + + if orphaned_export: + print('ERROR: TORRENT_EXPORT without function or class!\n%s:%d\n%s' % (filename, lno, line)) + sys.exit(1) + lno += 1 if line == '': @@ -704,6 +720,18 @@ for filename in files: context = '' continue + if 'TORRENT_EXPORT' in line.split() \ + and 'ifndef TORRENT_EXPORT' not in line \ + and 'define TORRENT_DEPRECATED_EXPORT TORRENT_EXPORT' not in line \ + and 'define TORRENT_EXPORT' not in line \ + and 'for TORRENT_EXPORT' not in line \ + and 'TORRENT_EXPORT TORRENT_CFG' not in line \ + and 'extern TORRENT_EXPORT ' not in line \ + and 'struct TORRENT_EXPORT ' not in line: + orphaned_export = True + if verbose: + print('maybe orphaned: %s\n' % line) + if line.startswith('//') and line[2:].strip() == 'OVERVIEW': # this is a section overview current_overview = '' diff --git a/include/libtorrent/config.hpp b/include/libtorrent/config.hpp index a6c6acc7a..152b88ec3 100644 --- a/include/libtorrent/config.hpp +++ b/include/libtorrent/config.hpp @@ -497,7 +497,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif #if !defined(TORRENT_READ_HANDLER_MAX_SIZE) -# ifdef _GLIBCXX_DEBUG +# if defined _GLIBCXX_DEBUG || !defined NDEBUG constexpr std::size_t TORRENT_READ_HANDLER_MAX_SIZE = 400; # else // if this is not divisible by 8, we're wasting space @@ -506,7 +506,7 @@ constexpr std::size_t TORRENT_READ_HANDLER_MAX_SIZE = 342; #endif #if !defined(TORRENT_WRITE_HANDLER_MAX_SIZE) -# ifdef _GLIBCXX_DEBUG +# if defined _GLIBCXX_DEBUG || !defined NDEBUG constexpr std::size_t TORRENT_WRITE_HANDLER_MAX_SIZE = 400; # else // if this is not divisible by 8, we're wasting space diff --git a/include/libtorrent/kademlia/dht_storage.hpp b/include/libtorrent/kademlia/dht_storage.hpp index 9276cb699..8f18d84c9 100644 --- a/include/libtorrent/kademlia/dht_storage.hpp +++ b/include/libtorrent/kademlia/dht_storage.hpp @@ -236,8 +236,8 @@ namespace libtorrent { namespace dht { using dht_storage_constructor_type = std::function(dht_settings const& settings)>; - TORRENT_EXPORT std::unique_ptr - dht_default_storage_constructor(dht_settings const& settings); + TORRENT_EXPORT std::unique_ptr dht_default_storage_constructor( + dht_settings const& settings); } } // namespace libtorrent::dht diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 4558f8590..0d8c418e4 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -1046,7 +1046,7 @@ namespace aux { #endif #ifdef TORRENT_USE_OPENSSL - bool const use_ssl = req.ssl_ctx != nullptr; + bool const use_ssl = req.ssl_ctx != nullptr && req.ssl_ctx != &m_ssl_ctx; if (!use_ssl) req.ssl_ctx = &m_ssl_ctx; #endif diff --git a/src/utp_stream.cpp b/src/utp_stream.cpp index 2d96cf459..546a833ee 100644 --- a/src/utp_stream.cpp +++ b/src/utp_stream.cpp @@ -139,16 +139,7 @@ enum // if a packet receives more than this number of // duplicate acks, we'll trigger a fast re-send - dup_ack_limit = 3, - - // the max number of packets to fast-resend per - // selective ack message - // only re-sending a single packet per sack - // appears to improve performance by making it - // less likely to loose the re-sent packet. Because - // when that happens, we must time-out in order - // to continue, which takes a long time. - sack_resend_limit = 1 + dup_ack_limit = 3 }; // compare if lhs is less than rhs, taking wrapping @@ -1543,15 +1534,21 @@ std::pair utp_socket_impl::parse_sack(std::uint16_t const pa { experienced_loss(m_fast_resend_seq_nr); int num_resent = 0; - while (m_fast_resend_seq_nr != last_ack) + + // only re-sending a single packet per sack + // appears to improve performance by making it + // less likely to loose the re-sent packet. Because + // when that happens, we must time-out in order + // to continue, which takes a long time. + if (m_fast_resend_seq_nr != last_ack) { packet* p = m_outbuf.at(m_fast_resend_seq_nr); m_fast_resend_seq_nr = (m_fast_resend_seq_nr + 1) & ACK_MASK; - if (!p) continue; - ++num_resent; - if (!resend_packet(p, true)) break; - m_duplicate_acks = 0; - if (num_resent >= sack_resend_limit) break; + if (p) + { + ++num_resent; + if (resend_packet(p, true)) m_duplicate_acks = 0; + } } } @@ -2876,13 +2873,6 @@ bool utp_socket_impl::incoming_packet(span buf } std::uint8_t const next_extension = *ptr++; int const len = *ptr++; - if (len < 0) - { - UTP_LOGV("%8p: invalid extension length:%d packet:%d\n" - , static_cast(this), len, int(ptr - buf.data())); - m_sm.inc_stats_counter(counters::utp_invalid_pkts_in); - return true; - } if (ptr - buf.data() + len > size) { UTP_LOG("%8p: ERROR: invalid extension header size:%d packet:%d\n"