added more allocation logging for statistics builds. Identified and fixed some memory waste
This commit is contained in:
@@ -77,6 +77,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "libtorrent/udp_socket.hpp"
|
#include "libtorrent/udp_socket.hpp"
|
||||||
#include "libtorrent/assert.hpp"
|
#include "libtorrent/assert.hpp"
|
||||||
#include "libtorrent/policy.hpp" // for policy::peer
|
#include "libtorrent/policy.hpp" // for policy::peer
|
||||||
|
#include "libtorrent/alert.hpp" // for alert_manager
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
@@ -350,7 +351,37 @@ namespace libtorrent
|
|||||||
// are allocated. It's a pool since we're likely
|
// are allocated. It's a pool since we're likely
|
||||||
// to have tens of thousands of peers, and a pool
|
// to have tens of thousands of peers, and a pool
|
||||||
// saves significant overhead
|
// saves significant overhead
|
||||||
|
#ifdef TORRENT_STATS
|
||||||
|
struct logging_allocator
|
||||||
|
{
|
||||||
|
typedef std::size_t size_type;
|
||||||
|
typedef std::ptrdiff_t difference_type;
|
||||||
|
|
||||||
|
static char* malloc(const size_type bytes)
|
||||||
|
{
|
||||||
|
allocated_bytes += bytes;
|
||||||
|
++allocations;
|
||||||
|
return (char*)::malloc(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void free(char* const block)
|
||||||
|
{
|
||||||
|
--allocations;
|
||||||
|
return ::free(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int allocations;
|
||||||
|
static int allocated_bytes;
|
||||||
|
};
|
||||||
|
boost::object_pool<policy::peer, logging_allocator> m_peer_pool;
|
||||||
|
#else
|
||||||
boost::object_pool<policy::peer> m_peer_pool;
|
boost::object_pool<policy::peer> m_peer_pool;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// this vector is used to store the block_info
|
||||||
|
// objects pointed to by partial_piece_info returned
|
||||||
|
// by torrent::get_download_queue.
|
||||||
|
std::vector<block_info> m_block_info_storage;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
// this pool is used to allocate and recycle send
|
// this pool is used to allocate and recycle send
|
||||||
@@ -658,11 +689,6 @@ namespace libtorrent
|
|||||||
size_type m_total_failed_bytes;
|
size_type m_total_failed_bytes;
|
||||||
size_type m_total_redundant_bytes;
|
size_type m_total_redundant_bytes;
|
||||||
|
|
||||||
// this vector is used to store the block_info
|
|
||||||
// objects pointed to by partial_piece_info returned
|
|
||||||
// by torrent::get_download_queue.
|
|
||||||
std::vector<block_info> m_block_info_storage;
|
|
||||||
|
|
||||||
// the main working thread
|
// the main working thread
|
||||||
boost::scoped_ptr<boost::thread> m_thread;
|
boost::scoped_ptr<boost::thread> m_thread;
|
||||||
};
|
};
|
||||||
|
@@ -52,7 +52,7 @@ namespace libtorrent
|
|||||||
: m_block_size(block_size)
|
: m_block_size(block_size)
|
||||||
, m_in_use(0)
|
, m_in_use(0)
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
, m_pool(block_size, 10)
|
, m_pool(block_size, 16)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#if defined TORRENT_DISK_STATS || defined TORRENT_STATS
|
#if defined TORRENT_DISK_STATS || defined TORRENT_STATS
|
||||||
@@ -95,6 +95,7 @@ namespace libtorrent
|
|||||||
char* ret = page_aligned_allocator::malloc(m_block_size);
|
char* ret = page_aligned_allocator::malloc(m_block_size);
|
||||||
#else
|
#else
|
||||||
char* ret = (char*)m_pool.ordered_malloc();
|
char* ret = (char*)m_pool.ordered_malloc();
|
||||||
|
m_pool.set_next_size(16);
|
||||||
#endif
|
#endif
|
||||||
++m_in_use;
|
++m_in_use;
|
||||||
#if TORRENT_USE_MLOCK
|
#if TORRENT_USE_MLOCK
|
||||||
@@ -161,6 +162,7 @@ namespace libtorrent
|
|||||||
char* ret = page_aligned_allocator::malloc(m_block_size * num_blocks);
|
char* ret = page_aligned_allocator::malloc(m_block_size * num_blocks);
|
||||||
#else
|
#else
|
||||||
char* ret = (char*)m_pool.ordered_malloc(num_blocks);
|
char* ret = (char*)m_pool.ordered_malloc(num_blocks);
|
||||||
|
m_pool.set_next_size(16);
|
||||||
#endif
|
#endif
|
||||||
m_in_use += num_blocks;
|
m_in_use += num_blocks;
|
||||||
#if TORRENT_USE_MLOCK
|
#if TORRENT_USE_MLOCK
|
||||||
|
@@ -691,6 +691,7 @@ namespace libtorrent
|
|||||||
|
|
||||||
if (m_round_robin > iter - m_peers.begin()) ++m_round_robin;
|
if (m_round_robin > iter - m_peers.begin()) ++m_round_robin;
|
||||||
peer* p = m_torrent->session().m_peer_pool.malloc();
|
peer* p = m_torrent->session().m_peer_pool.malloc();
|
||||||
|
m_torrent->session().m_peer_pool.set_next_size(500);
|
||||||
new (p) peer(c.remote(), false, 0);
|
new (p) peer(c.remote(), false, 0);
|
||||||
iter = m_peers.insert(iter, p);
|
iter = m_peers.insert(iter, p);
|
||||||
|
|
||||||
@@ -831,6 +832,7 @@ namespace libtorrent
|
|||||||
// we don't have any info about this peer.
|
// we don't have any info about this peer.
|
||||||
// add a new entry
|
// add a new entry
|
||||||
peer* p = m_torrent->session().m_peer_pool.malloc();
|
peer* p = m_torrent->session().m_peer_pool.malloc();
|
||||||
|
m_torrent->session().m_peer_pool.set_next_size(500);
|
||||||
new (p) peer(remote, true, src);
|
new (p) peer(remote, true, src);
|
||||||
iter = m_peers.insert(iter, p);
|
iter = m_peers.insert(iter, p);
|
||||||
|
|
||||||
|
@@ -141,6 +141,11 @@ namespace aux {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef TORRENT_STATS
|
||||||
|
int session_impl::logging_allocator::allocations = 0;
|
||||||
|
int session_impl::logging_allocator::allocated_bytes = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
session_impl::session_impl(
|
session_impl::session_impl(
|
||||||
std::pair<int, int> listen_port_range
|
std::pair<int, int> listen_port_range
|
||||||
, fingerprint const& cl_fprint
|
, fingerprint const& cl_fprint
|
||||||
@@ -265,7 +270,8 @@ namespace aux {
|
|||||||
m_stats_logger.open("session_stats.log", std::ios::trunc);
|
m_stats_logger.open("session_stats.log", std::ios::trunc);
|
||||||
m_stats_logger <<
|
m_stats_logger <<
|
||||||
"second:upload rate:download rate:downloading torrents:seeding torrents"
|
"second:upload rate:download rate:downloading torrents:seeding torrents"
|
||||||
":peers:connecting peers:disk block buffers:unchoked peers:num list peers\n\n";
|
":peers:connecting peers:disk block buffers:unchoked peers:num list peers"
|
||||||
|
":peer allocations:peer storage bytes\n\n";
|
||||||
m_buffer_usage_logger.open("buffer_stats.log", std::ios::trunc);
|
m_buffer_usage_logger.open("buffer_stats.log", std::ios::trunc);
|
||||||
m_second_counter = 0;
|
m_second_counter = 0;
|
||||||
m_buffer_allocations = 0;
|
m_buffer_allocations = 0;
|
||||||
@@ -1236,6 +1242,8 @@ namespace aux {
|
|||||||
<< m_disk_thread.disk_allocations() << "\t"
|
<< m_disk_thread.disk_allocations() << "\t"
|
||||||
<< unchoked_peers << "\t"
|
<< unchoked_peers << "\t"
|
||||||
<< num_peers << "\t"
|
<< num_peers << "\t"
|
||||||
|
<< logging_allocator::allocations << "\t"
|
||||||
|
<< logging_allocator::allocated_bytes << "\t"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user