diff --git a/include/libtorrent/kademlia/observer.hpp b/include/libtorrent/kademlia/observer.hpp index 254129968..b8fb1a171 100644 --- a/include/libtorrent/kademlia/observer.hpp +++ b/include/libtorrent/kademlia/observer.hpp @@ -82,10 +82,12 @@ struct observer : boost::noncopyable m_in_constructor = true; m_was_sent = false; m_was_abandoned = false; + m_in_use = true; #endif set_target(ep); } + // defined in rpc_manager.cpp virtual ~observer(); // this is called when a reply is received @@ -167,6 +169,7 @@ public: bool m_in_constructor:1; bool m_was_sent:1; bool m_was_abandoned:1; + bool m_in_use:1; #endif }; diff --git a/src/kademlia/rpc_manager.cpp b/src/kademlia/rpc_manager.cpp index b61b23936..7be84086a 100644 --- a/src/kademlia/rpc_manager.cpp +++ b/src/kademlia/rpc_manager.cpp @@ -216,7 +216,11 @@ void* rpc_manager::allocate_observer() { m_pool_allocator.set_next_size(10); void* ret = m_pool_allocator.malloc(); - if (ret) ++m_allocated_observers; + if (ret) + { + ++m_allocated_observers; + TORRENT_ASSERT(reinterpret_cast(ret)->m_in_use == false); + } return ret; } @@ -224,6 +228,7 @@ void rpc_manager::free_observer(void* ptr) { if (!ptr) return; --m_allocated_observers; + TORRENT_ASSERT(reinterpret_cast(ptr)->m_in_use == true); m_pool_allocator.free(ptr); } @@ -502,6 +507,10 @@ observer::~observer() // reported back TORRENT_ASSERT(m_was_sent == bool(flags & flag_done) || m_was_abandoned); TORRENT_ASSERT(!m_in_constructor); +#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS + TORRENT_ASSERT(m_in_use); + m_in_use = false; +#endif } } } // namespace libtorrent::dht