diff --git a/Jamfile b/Jamfile index f9b68dce6..869c99592 100755 --- a/Jamfile +++ b/Jamfile @@ -83,7 +83,7 @@ rule linking ( properties * ) { # for backtraces in assertion failures # which only works on ELF targets with gcc - result += -rdynamic src/assert.cpp ; + result += -export-dynamic -rdynamic ; } if source in $(properties) @@ -104,6 +104,15 @@ rule building ( properties * ) { local result ; + if gcc in $(properties) + && linux in $(properties) + && debug in $(properties) + { + # for backtraces in assertion failures + # which only works on ELF targets with gcc + result += src/assert.cpp ; + } + if off in $(properties) { result += src/sha1.cpp ; @@ -270,6 +279,11 @@ local usage-requirements = # disable bogus deprecation warnings on msvc8 msvc:_SCL_SECURE_NO_DEPRECATE msvc:_CRT_SECURE_NO_DEPRECATE +# msvc optimizations + msvc,release:/OPT:ICF=5 + msvc,release:/OPT:REF +# disable warning C4503: decorated name length exceeded, name was truncated + msvc:/wd4503 ; project torrent ; diff --git a/include/libtorrent/alert.hpp b/include/libtorrent/alert.hpp index b6b6711dc..954e39ef5 100755 --- a/include/libtorrent/alert.hpp +++ b/include/libtorrent/alert.hpp @@ -36,7 +36,6 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include #include #ifdef _MSC_VER @@ -56,6 +55,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/time.hpp" #include "libtorrent/config.hpp" +#include "libtorrent/assert.hpp" #ifndef TORRENT_MAX_ALERT_TYPES #define TORRENT_MAX_ALERT_TYPES 15 diff --git a/include/libtorrent/assert.hpp b/include/libtorrent/assert.hpp index 488afe778..8ab605080 100644 --- a/include/libtorrent/assert.hpp +++ b/include/libtorrent/assert.hpp @@ -33,15 +33,17 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef TORRENT_ASSERT_HPP_INCLUDED #define TORRENT_ASSERT_HPP_INCLUDED +#include + #ifndef NDEBUG -#if defined __linux__ && defined _GNUC +#if defined __linux__ && defined __GNUC__ #ifdef assert #undef assert #endif -void assert_fail(int line, char const* file); +void assert_fail(const char* expr, int line, char const* file, char const* function); -#define assert(x) if (!(x)) assert_fail(__LINE__, __FILE__) +#define assert(x) if (!(x)) assert_fail(#x, __LINE__, __FILE__, __PRETTY_FUNCTION__) #endif diff --git a/include/libtorrent/config.hpp b/include/libtorrent/config.hpp index b36d4da22..1281ab84c 100755 --- a/include/libtorrent/config.hpp +++ b/include/libtorrent/config.hpp @@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_CONFIG_HPP_INCLUDED #include +#include "libtorrent/assert.hpp" #if defined(__GNUC__) && __GNUC__ >= 4 diff --git a/include/libtorrent/entry.hpp b/include/libtorrent/entry.hpp index 59e29803d..7fd6c8c53 100755 --- a/include/libtorrent/entry.hpp +++ b/include/libtorrent/entry.hpp @@ -64,10 +64,10 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include #include "libtorrent/size_type.hpp" #include "libtorrent/config.hpp" +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/include/libtorrent/hasher.hpp b/include/libtorrent/hasher.hpp index 932f2b100..71b7f9ede 100755 --- a/include/libtorrent/hasher.hpp +++ b/include/libtorrent/hasher.hpp @@ -33,11 +33,11 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef TORRENT_HASHER_HPP_INCLUDED #define TORRENT_HASHER_HPP_INCLUDED -#include #include #include "libtorrent/peer_id.hpp" #include "libtorrent/config.hpp" +#include "libtorrent/assert.hpp" #include "zlib.h" #ifdef TORRENT_USE_OPENSSL diff --git a/include/libtorrent/intrusive_ptr_base.hpp b/include/libtorrent/intrusive_ptr_base.hpp index 39ba2e77f..ed6944ebb 100644 --- a/include/libtorrent/intrusive_ptr_base.hpp +++ b/include/libtorrent/intrusive_ptr_base.hpp @@ -34,8 +34,8 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_INTRUSIVE_PTR_BASE #include -#include #include "libtorrent/config.hpp" +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/include/libtorrent/invariant_check.hpp b/include/libtorrent/invariant_check.hpp index c6eacf338..3eaacf34c 100755 --- a/include/libtorrent/invariant_check.hpp +++ b/include/libtorrent/invariant_check.hpp @@ -5,7 +5,7 @@ #ifndef TORRENT_INVARIANT_ACCESS_HPP_INCLUDED #define TORRENT_INVARIANT_ACCESS_HPP_INCLUDED -#include +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/include/libtorrent/kademlia/node.hpp b/include/libtorrent/kademlia/node.hpp index 850333043..ee75e7f0a 100644 --- a/include/libtorrent/kademlia/node.hpp +++ b/include/libtorrent/kademlia/node.hpp @@ -34,7 +34,6 @@ POSSIBILITY OF SUCH DAMAGE. #define NODE_HPP #include -#include #include #include @@ -45,6 +44,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include +#include #include #include diff --git a/include/libtorrent/kademlia/node_id.hpp b/include/libtorrent/kademlia/node_id.hpp index eb4d6c539..5e732acac 100644 --- a/include/libtorrent/kademlia/node_id.hpp +++ b/include/libtorrent/kademlia/node_id.hpp @@ -33,10 +33,10 @@ POSSIBILITY OF SUCH DAMAGE. #define NODE_ID_HPP #include -#include #include #include "libtorrent/peer_id.hpp" +#include "libtorrent/assert.hpp" namespace libtorrent { namespace dht { diff --git a/include/libtorrent/pe_crypto.hpp b/include/libtorrent/pe_crypto.hpp index 91616c42d..e2276dee6 100644 --- a/include/libtorrent/pe_crypto.hpp +++ b/include/libtorrent/pe_crypto.hpp @@ -35,13 +35,12 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef TORRENT_PE_CRYPTO_HPP_INCLUDED #define TORRENT_PE_CRYPTO_HPP_INCLUDED -#include - #include #include #include -#include "peer_id.hpp" // For sha1_hash +#include "libtorrent/peer_id.hpp" // For sha1_hash +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/include/libtorrent/peer_id.hpp b/include/libtorrent/peer_id.hpp index b66c1d4bc..57303e2fd 100755 --- a/include/libtorrent/peer_id.hpp +++ b/include/libtorrent/peer_id.hpp @@ -35,12 +35,12 @@ POSSIBILITY OF SUCH DAMAGE. #include #include -#include #include #include #include #include "libtorrent/config.hpp" +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/include/libtorrent/piece_picker.hpp b/include/libtorrent/piece_picker.hpp index 8e396bdff..4305c2dde 100755 --- a/include/libtorrent/piece_picker.hpp +++ b/include/libtorrent/piece_picker.hpp @@ -35,7 +35,6 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include #include #ifdef _MSC_VER @@ -52,6 +51,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/socket.hpp" #include "libtorrent/session_settings.hpp" #include "libtorrent/config.hpp" +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/src/assert.cpp b/src/assert.cpp index c2cb1b4a5..da79a745b 100644 --- a/src/assert.cpp +++ b/src/assert.cpp @@ -32,9 +32,11 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef NDEBUG +#include +#include #include -void assert_fail(int line, char const* file) +void assert_fail(char const* expr, int line, char const* file, char const* function) { fprintf(stderr, "assertion failed. Please file a bugreport at " @@ -42,9 +44,11 @@ void assert_fail(int line, char const* file) "Please include the following information:\n\n" "file: '%s'\n" "line: %d\n" - "stack:\n", file, line); + "function: %s\n" + "expression: %s\n" + "stack:\n", file, line, function, expr); - void* stacktrace[50]; + void* stack[50]; int size = backtrace(stack, 50); char** symbols = backtrace_symbols(stack, size); @@ -54,6 +58,7 @@ void assert_fail(int line, char const* file) } free(symbols); + exit(1); } #endif diff --git a/src/escape_string.cpp b/src/escape_string.cpp index 02a4fa085..673d56288 100755 --- a/src/escape_string.cpp +++ b/src/escape_string.cpp @@ -31,9 +31,9 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "libtorrent/pch.hpp" +#include "libtorrent/assert.hpp" #include -#include #include #include #include diff --git a/src/kademlia/node_id.cpp b/src/kademlia/node_id.cpp index 4ed413714..ad06c515d 100644 --- a/src/kademlia/node_id.cpp +++ b/src/kademlia/node_id.cpp @@ -34,10 +34,10 @@ POSSIBILITY OF SUCH DAMAGE. #include #include -#include #include #include "libtorrent/kademlia/node_id.hpp" +#include "libtorrent/assert.hpp" using boost::bind; diff --git a/src/pe_crypto.cpp b/src/pe_crypto.cpp index 437c93e2c..981eca63d 100644 --- a/src/pe_crypto.cpp +++ b/src/pe_crypto.cpp @@ -32,13 +32,13 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef TORRENT_DISABLE_ENCRYPTION -#include #include #include #include #include "libtorrent/pe_crypto.hpp" +#include "libtorrent/assert.hpp" namespace libtorrent { diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index c6be880ad..c7bd3dc5e 100755 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -51,6 +51,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/aux_/session_impl.hpp" #include "libtorrent/policy.hpp" #include "libtorrent/socket_type.hpp" +#include "libtorrent/assert.hpp" using boost::bind; using boost::shared_ptr; diff --git a/src/upnp.cpp b/src/upnp.cpp index aefff41b1..e16c136bb 100644 --- a/src/upnp.cpp +++ b/src/upnp.cpp @@ -323,7 +323,13 @@ try #endif { using namespace libtorrent::detail; - if (e) return; + if (e) + { +#ifdef TORRENT_UPNP_LOGGING + m_log << time_now_string() << " *** on_reply aborted: " << e.message() << std::endl; +#endif + return; + } // parse out the url for the device @@ -843,9 +849,16 @@ void upnp::on_upnp_map_response(asio::error_code const& e { #ifdef TORRENT_UPNP_LOGGING m_log << time_now_string() - << " <== error while adding portmap: " << p.message() << std::endl; + << " <== error while adding portmap: " << p.status_code() << " " << p.message() << std::endl; #endif - m_devices.erase(d); + for (int i = 0; i < num_mappings; ++i) + { + if (d.mapping[i].need_update) + { + map_port(d, i); + return; + } + } return; }