forked from premiere/premiere-libtorrent
remove support for using a pool allocator for disk buffers (#2257)
This commit is contained in:
parent
070066e892
commit
2365611507
|
@ -18,6 +18,7 @@
|
||||||
* added support for retrieval of DHT live nodes
|
* added support for retrieval of DHT live nodes
|
||||||
* complete UNC path support
|
* complete UNC path support
|
||||||
* add packets pool allocator
|
* add packets pool allocator
|
||||||
|
* remove disk buffer pool allocator
|
||||||
* fix last_upload and last_download overflow after 9 hours in past
|
* fix last_upload and last_download overflow after 9 hours in past
|
||||||
* python binding add more add_torrent_params fields and an invalid key check
|
* python binding add more add_torrent_params fields and an invalid key check
|
||||||
* introduce introduce distinct types for peer_class_t, piece_index_t and
|
* introduce introduce distinct types for peer_class_t, piece_index_t and
|
||||||
|
|
|
@ -35,15 +35,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
#include "libtorrent/allocator.hpp" // for page_aligned_allocator
|
|
||||||
#include <boost/pool/pool.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
|
||||||
|
|
||||||
#if TORRENT_USE_INVARIANT_CHECKS
|
#if TORRENT_USE_INVARIANT_CHECKS
|
||||||
#include <set>
|
#include <set>
|
||||||
#endif
|
#endif
|
||||||
|
@ -87,8 +78,6 @@ namespace libtorrent {
|
||||||
|
|
||||||
int block_size() const { return m_block_size; }
|
int block_size() const { return m_block_size; }
|
||||||
|
|
||||||
void release_memory();
|
|
||||||
|
|
||||||
int in_use() const
|
int in_use() const
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_pool_mutex);
|
std::unique_lock<std::mutex> l(m_pool_mutex);
|
||||||
|
@ -144,28 +133,6 @@ namespace libtorrent {
|
||||||
|
|
||||||
int m_cache_buffer_chunk_size;
|
int m_cache_buffer_chunk_size;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
// if this is true, all buffers are allocated
|
|
||||||
// from m_pool. If this is false, all buffers
|
|
||||||
// are allocated using page_aligned_allocator.
|
|
||||||
// if the settings change to prefer the other
|
|
||||||
// allocator, this bool will not switch over
|
|
||||||
// to match the settings until all buffers have
|
|
||||||
// been freed. That way, we never have a mixture
|
|
||||||
// of buffers allocated from different sources.
|
|
||||||
// in essence, this make the setting only take
|
|
||||||
// effect after a restart (which seems fine).
|
|
||||||
// or once the client goes idle for a while.
|
|
||||||
bool m_using_pool_allocator;
|
|
||||||
|
|
||||||
// this is the actual user setting
|
|
||||||
bool m_want_pool_allocator;
|
|
||||||
|
|
||||||
// memory pool for read and write operations
|
|
||||||
// and disk cache
|
|
||||||
boost::pool<page_aligned_allocator> m_pool;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// this is specifically exempt from release_asserts
|
// this is specifically exempt from release_asserts
|
||||||
// since it's a quite costly check. Only for debug
|
// since it's a quite costly check. Only for debug
|
||||||
// builds.
|
// builds.
|
||||||
|
|
|
@ -642,11 +642,15 @@ namespace libtorrent {
|
||||||
// failure is preferred, set this to false.
|
// failure is preferred, set this to false.
|
||||||
listen_system_port_fallback,
|
listen_system_port_fallback,
|
||||||
|
|
||||||
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
// ``use_disk_cache_pool`` enables using a pool allocator for disk
|
// ``use_disk_cache_pool`` enables using a pool allocator for disk
|
||||||
// cache blocks. Enabling it makes the cache perform better at high
|
// cache blocks. Enabling it makes the cache perform better at high
|
||||||
// throughput. It also makes the cache less likely and slower at
|
// throughput. It also makes the cache less likely and slower at
|
||||||
// returning memory back to the system, once allocated.
|
// returning memory back to the system, once allocated.
|
||||||
use_disk_cache_pool,
|
use_disk_cache_pool,
|
||||||
|
#else
|
||||||
|
deprecated24,
|
||||||
|
#endif
|
||||||
|
|
||||||
// when this is true, and incoming encrypted connections are enabled,
|
// when this is true, and incoming encrypted connections are enabled,
|
||||||
// &supportcrypt=1 is included in http tracker announces
|
// &supportcrypt=1 is included in http tracker announces
|
||||||
|
|
|
@ -293,7 +293,6 @@ namespace libtorrent {
|
||||||
//
|
//
|
||||||
// int block_size() const { return m_block_size; }
|
// int block_size() const { return m_block_size; }
|
||||||
//
|
//
|
||||||
// void release_memory();
|
|
||||||
// };
|
// };
|
||||||
virtual void delete_files(remove_flags_t options, storage_error& ec) = 0;
|
virtual void delete_files(remove_flags_t options, storage_error& ec) = 0;
|
||||||
|
|
||||||
|
|
|
@ -692,9 +692,6 @@ cached_piece_entry* block_cache::allocate_piece(disk_io_job const* j, std::uint1
|
||||||
|
|
||||||
cached_piece_entry* block_cache::add_dirty_block(disk_io_job* j)
|
cached_piece_entry* block_cache::add_dirty_block(disk_io_job* j)
|
||||||
{
|
{
|
||||||
#if !defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
TORRENT_ASSERT(is_disk_buffer(boost::get<disk_buffer_holder>(j->argument).get()));
|
|
||||||
#endif
|
|
||||||
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
#ifdef TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1616,14 +1613,6 @@ void block_cache::check_invariant() const
|
||||||
{
|
{
|
||||||
if (p.blocks[k].buf)
|
if (p.blocks[k].buf)
|
||||||
{
|
{
|
||||||
#if !defined TORRENT_DISABLE_POOL_ALLOCATOR && defined TORRENT_EXPENSIVE_INVARIANT_CHECKS
|
|
||||||
TORRENT_PIECE_ASSERT(is_disk_buffer(p.blocks[k].buf), &p);
|
|
||||||
|
|
||||||
// make sure we don't have the same buffer
|
|
||||||
// in the cache twice
|
|
||||||
TORRENT_PIECE_ASSERT(buffers.count(p.blocks[k].buf) == 0, &p);
|
|
||||||
buffers.insert(p.blocks[k].buf);
|
|
||||||
#endif
|
|
||||||
++num_blocks;
|
++num_blocks;
|
||||||
if (p.blocks[k].dirty)
|
if (p.blocks[k].dirty)
|
||||||
{
|
{
|
||||||
|
|
|
@ -77,11 +77,6 @@ namespace libtorrent {
|
||||||
, m_exceeded_max_size(false)
|
, m_exceeded_max_size(false)
|
||||||
, m_ios(ios)
|
, m_ios(ios)
|
||||||
, m_cache_buffer_chunk_size(0)
|
, m_cache_buffer_chunk_size(0)
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
, m_using_pool_allocator(false)
|
|
||||||
, m_want_pool_allocator(false)
|
|
||||||
, m_pool(block_size, 32)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
#if TORRENT_USE_ASSERTS
|
#if TORRENT_USE_ASSERTS
|
||||||
m_magic = 0x1337;
|
m_magic = 0x1337;
|
||||||
|
@ -145,13 +140,9 @@ namespace libtorrent {
|
||||||
return m_buffers_in_use.count(buffer) == 1;
|
return m_buffers_in_use.count(buffer) == 1;
|
||||||
#elif defined TORRENT_DEBUG_BUFFERS
|
#elif defined TORRENT_DEBUG_BUFFERS
|
||||||
return page_aligned_allocator::in_use(buffer);
|
return page_aligned_allocator::in_use(buffer);
|
||||||
#elif defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
return true;
|
|
||||||
#else
|
#else
|
||||||
if (m_using_pool_allocator)
|
TORRENT_UNUSED(buffer);
|
||||||
return m_pool.is_from(buffer);
|
return true;
|
||||||
else
|
|
||||||
return true;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,28 +228,8 @@ namespace libtorrent {
|
||||||
TORRENT_ASSERT(l.owns_lock());
|
TORRENT_ASSERT(l.owns_lock());
|
||||||
TORRENT_UNUSED(l);
|
TORRENT_UNUSED(l);
|
||||||
|
|
||||||
char* ret;
|
char* ret = page_aligned_allocator::malloc(m_block_size);
|
||||||
#if defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
|
|
||||||
ret = page_aligned_allocator::malloc(m_block_size);
|
|
||||||
|
|
||||||
#else
|
|
||||||
if (m_using_pool_allocator)
|
|
||||||
{
|
|
||||||
int const effective_block_size
|
|
||||||
= m_in_use >= m_max_use
|
|
||||||
? 20 // use small increments once we've exceeded the cache size
|
|
||||||
: m_cache_buffer_chunk_size
|
|
||||||
? m_cache_buffer_chunk_size
|
|
||||||
: std::max(m_max_use / 10, 1);
|
|
||||||
m_pool.set_next_size(effective_block_size);
|
|
||||||
ret = static_cast<char*>(m_pool.malloc());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = page_aligned_allocator::malloc(m_block_size);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (ret == nullptr)
|
if (ret == nullptr)
|
||||||
{
|
{
|
||||||
m_exceeded_max_size = true;
|
m_exceeded_max_size = true;
|
||||||
|
@ -324,14 +295,6 @@ namespace libtorrent {
|
||||||
// 0 cache_buffer_chunk_size means 'automatic' (i.e.
|
// 0 cache_buffer_chunk_size means 'automatic' (i.e.
|
||||||
// proportional to the total disk cache size)
|
// proportional to the total disk cache size)
|
||||||
m_cache_buffer_chunk_size = sett.get_int(settings_pack::cache_buffer_chunk_size);
|
m_cache_buffer_chunk_size = sett.get_int(settings_pack::cache_buffer_chunk_size);
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
// if the chunk size is set to 1, there's no point in creating a pool
|
|
||||||
m_want_pool_allocator = sett.get_bool(settings_pack::use_disk_cache_pool)
|
|
||||||
&& (m_cache_buffer_chunk_size != 1);
|
|
||||||
// if there are no allocated blocks, it's OK to switch allocator
|
|
||||||
if (m_in_use == 0)
|
|
||||||
m_using_pool_allocator = m_want_pool_allocator;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int const cache_size = sett.get_int(settings_pack::cache_size);
|
int const cache_size = sett.get_int(settings_pack::cache_size);
|
||||||
if (cache_size < 0)
|
if (cache_size < 0)
|
||||||
|
@ -419,37 +382,9 @@ namespace libtorrent {
|
||||||
TORRENT_ASSERT(l.owns_lock());
|
TORRENT_ASSERT(l.owns_lock());
|
||||||
TORRENT_UNUSED(l);
|
TORRENT_UNUSED(l);
|
||||||
|
|
||||||
#if defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
|
|
||||||
page_aligned_allocator::free(buf);
|
page_aligned_allocator::free(buf);
|
||||||
|
|
||||||
#else
|
|
||||||
if (m_using_pool_allocator)
|
|
||||||
m_pool.free(buf);
|
|
||||||
else
|
|
||||||
page_aligned_allocator::free(buf);
|
|
||||||
#endif // TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
|
|
||||||
--m_in_use;
|
--m_in_use;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
// should we switch which allocator to use?
|
|
||||||
if (m_in_use == 0 && m_want_pool_allocator != m_using_pool_allocator)
|
|
||||||
{
|
|
||||||
m_pool.release_memory();
|
|
||||||
m_using_pool_allocator = m_want_pool_allocator;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void disk_buffer_pool::release_memory()
|
|
||||||
{
|
|
||||||
TORRENT_ASSERT(m_magic == 0x1337);
|
|
||||||
#ifndef TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
std::unique_lock<std::mutex> l(m_pool_mutex);
|
|
||||||
if (m_using_pool_allocator)
|
|
||||||
m_pool.release_memory();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2569,8 +2569,6 @@ namespace libtorrent {
|
||||||
, completed_jobs, l);
|
, completed_jobs, l);
|
||||||
l.unlock();
|
l.unlock();
|
||||||
|
|
||||||
m_disk_cache.release_memory();
|
|
||||||
|
|
||||||
j->storage->release_files(j->error);
|
j->storage->release_files(j->error);
|
||||||
return j->error ? status_t::fatal_disk_error : status_t::no_error;
|
return j->error ? status_t::fatal_disk_error : status_t::no_error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,8 +240,6 @@ namespace libtorrent {
|
||||||
// of a resumed file
|
// of a resumed file
|
||||||
set.set_int(settings_pack::checking_mem_usage, 320);
|
set.set_int(settings_pack::checking_mem_usage, 320);
|
||||||
|
|
||||||
// the disk cache performs better with the pool allocator
|
|
||||||
set.set_bool(settings_pack::use_disk_cache_pool, true);
|
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3547,8 +3547,6 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// m_peer_pool.release_memory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
|
@ -189,7 +189,7 @@ constexpr int CLOSE_FILE_INTERVAL = 0;
|
||||||
SET(support_merkle_torrents, true, nullptr),
|
SET(support_merkle_torrents, true, nullptr),
|
||||||
SET(report_redundant_bytes, true, nullptr),
|
SET(report_redundant_bytes, true, nullptr),
|
||||||
SET(listen_system_port_fallback, true, nullptr),
|
SET(listen_system_port_fallback, true, nullptr),
|
||||||
SET(use_disk_cache_pool, true, nullptr),
|
DEPRECATED_SET(use_disk_cache_pool, false, nullptr),
|
||||||
SET(announce_crypto_support, true, nullptr),
|
SET(announce_crypto_support, true, nullptr),
|
||||||
SET(enable_upnp, true, &session_impl::update_upnp),
|
SET(enable_upnp, true, &session_impl::update_upnp),
|
||||||
SET(enable_natpmp, true, &session_impl::update_natpmp),
|
SET(enable_natpmp, true, &session_impl::update_natpmp),
|
||||||
|
|
Loading…
Reference in New Issue