remove the purgable control patch. It adds a lot of complexity and it does not perform well
This commit is contained in:
parent
035f8e98d1
commit
55cd19d1e2
|
@ -169,8 +169,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
# endif
|
# endif
|
||||||
#include <AvailabilityMacros.h>
|
#include <AvailabilityMacros.h>
|
||||||
|
|
||||||
#define TORRENT_USE_PURGABLE_CONTROL 1
|
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
|
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
|
||||||
// on OSX, use the built-in common crypto for built-in
|
// on OSX, use the built-in common crypto for built-in
|
||||||
# if !defined TORRENT_USE_OPENSSL && !defined TORRENT_USE_GCRYPT
|
# if !defined TORRENT_USE_OPENSSL && !defined TORRENT_USE_GCRYPT
|
||||||
|
@ -611,10 +609,6 @@ int snprintf(char* buf, int len, char const* fmt, ...)
|
||||||
#define TORRENT_HAS_BOOST_UNORDERED 1
|
#define TORRENT_HAS_BOOST_UNORDERED 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
#define TORRENT_USE_PURGABLE_CONTROL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined TORRENT_IOV_MAX
|
#if !defined TORRENT_IOV_MAX
|
||||||
#ifdef IOV_MAX
|
#ifdef IOV_MAX
|
||||||
#define TORRENT_IOV_MAX IOV_MAX
|
#define TORRENT_IOV_MAX IOV_MAX
|
||||||
|
|
|
@ -49,20 +49,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/random.hpp"
|
#include "libtorrent/random.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
|
||||||
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
#include <mach/mach.h>
|
|
||||||
// see comments at:
|
|
||||||
// http://www.opensource.apple.com/source/xnu/xnu-792.13.8/osfmk/vm/vm_object.c
|
|
||||||
|
|
||||||
const vm_purgable_t vm_purgable_set_state = VM_PURGABLE_SET_STATE;
|
|
||||||
const vm_purgable_t vm_purgable_nonvolatile = VM_PURGABLE_NONVOLATILE;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
The disk cache mimics ARC (adaptive replacement cache).
|
The disk cache mimics ARC (adaptive replacement cache).
|
||||||
|
@ -1381,40 +1367,9 @@ void block_cache::insert_blocks(cached_piece_entry* pe, int block, file::iovec_t
|
||||||
TORRENT_UNUSED(ret); // suppress warning
|
TORRENT_UNUSED(ret); // suppress warning
|
||||||
TORRENT_ASSERT(ret);
|
TORRENT_ASSERT(ret);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL && defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
// volatile read blocks are group 0, regular reads are group 1
|
|
||||||
int state = VM_PURGABLE_VOLATILE | ((j->flags & disk_io_job::volatile_read) ? VM_VOLATILE_GROUP_0 : VM_VOLATILE_GROUP_1);
|
|
||||||
kern_return_t ret = vm_purgable_control(
|
|
||||||
mach_task_self(),
|
|
||||||
reinterpret_cast<vm_address_t>(pe->blocks[block].buf),
|
|
||||||
vm_purgable_set_state,
|
|
||||||
&state);
|
|
||||||
#ifdef TORRENT_DEBUG
|
|
||||||
// if ((random() % 200) == 0) ret = 1;
|
|
||||||
#endif
|
|
||||||
if (ret != KERN_SUCCESS || (state & VM_PURGABLE_EMPTY))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "insert_blocks(piece=%d block=%d): "
|
|
||||||
"vm_purgable_control failed: %d state & VM_PURGABLE_EMPTY: %d\n"
|
|
||||||
, pe->piece, block, ret, state & VM_PURGABLE_EMPTY);
|
|
||||||
free_buffer(pe->blocks[block].buf);
|
|
||||||
pe->blocks[block].buf = NULL;
|
|
||||||
--pe->num_blocks;
|
|
||||||
--m_read_cache_size;
|
|
||||||
if (j->flags & disk_io_job::volatile_read) --m_volatile_size;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL && defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
TORRENT_ASSERT(pe->blocks[block].buf != NULL
|
|
||||||
|| (flags & blocks_inc_refcount) == 0);
|
|
||||||
#else
|
|
||||||
TORRENT_ASSERT(pe->blocks[block].buf != NULL);
|
TORRENT_ASSERT(pe->blocks[block].buf != NULL);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_PIECE_ASSERT(pe->cache_state != cached_piece_entry::read_lru1_ghost, pe);
|
TORRENT_PIECE_ASSERT(pe->cache_state != cached_piece_entry::read_lru1_ghost, pe);
|
||||||
|
@ -1431,36 +1386,6 @@ bool block_cache::inc_block_refcount(cached_piece_entry* pe, int block, int reas
|
||||||
TORRENT_PIECE_ASSERT(pe->blocks[block].refcount < cached_block_entry::max_refcount, pe);
|
TORRENT_PIECE_ASSERT(pe->blocks[block].refcount < cached_block_entry::max_refcount, pe);
|
||||||
if (pe->blocks[block].refcount == 0)
|
if (pe->blocks[block].refcount == 0)
|
||||||
{
|
{
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL && defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
// we're adding the first refcount to this block, first make sure
|
|
||||||
// its still here. It's only volatile if it's not dirty and has refcount == 0
|
|
||||||
if (!pe->blocks[block].dirty)
|
|
||||||
{
|
|
||||||
int state = vm_purgable_nonvolatile;
|
|
||||||
kern_return_t ret = vm_purgable_control(
|
|
||||||
mach_task_self(),
|
|
||||||
reinterpret_cast<vm_address_t>(pe->blocks[block].buf),
|
|
||||||
vm_purgable_set_state,
|
|
||||||
&state);
|
|
||||||
#ifdef TORRENT_DEBUG
|
|
||||||
// if ((random() % 200) == 0) ret = 1;
|
|
||||||
#endif
|
|
||||||
if (ret != KERN_SUCCESS || (state & VM_PURGABLE_EMPTY))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "inc_block_refcount(piece=%d block=%d): "
|
|
||||||
"vm_purgable_control failed: %d state & VM_PURGABLE_EMPTY: %d\n"
|
|
||||||
, pe->piece, block, ret, state & VM_PURGABLE_EMPTY);
|
|
||||||
|
|
||||||
free_buffer(pe->blocks[block].buf);
|
|
||||||
pe->blocks[block].buf = NULL;
|
|
||||||
--pe->num_blocks;
|
|
||||||
--m_read_cache_size;
|
|
||||||
if (pe->cache_state == cached_piece_entry::volatile_read_lru)
|
|
||||||
--m_volatile_size;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
++pe->pinned;
|
++pe->pinned;
|
||||||
++m_pinned_blocks;
|
++m_pinned_blocks;
|
||||||
}
|
}
|
||||||
|
@ -1498,36 +1423,6 @@ void block_cache::dec_block_refcount(cached_piece_entry* pe, int block, int reas
|
||||||
--pe->pinned;
|
--pe->pinned;
|
||||||
TORRENT_PIECE_ASSERT(m_pinned_blocks > 0, pe);
|
TORRENT_PIECE_ASSERT(m_pinned_blocks > 0, pe);
|
||||||
--m_pinned_blocks;
|
--m_pinned_blocks;
|
||||||
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL && defined TORRENT_DISABLE_POOL_ALLOCATOR
|
|
||||||
// we're removing the last refcount to this block, first make sure
|
|
||||||
// its still here. It's only volatile if it's not dirty and has refcount == 0
|
|
||||||
if (!pe->blocks[block].dirty)
|
|
||||||
{
|
|
||||||
// group 0 is the first one to be reclaimed
|
|
||||||
int state = VM_PURGABLE_VOLATILE | VM_VOLATILE_GROUP_1;
|
|
||||||
kern_return_t ret = vm_purgable_control(
|
|
||||||
mach_task_self(),
|
|
||||||
reinterpret_cast<vm_address_t>(pe->blocks[block].buf),
|
|
||||||
vm_purgable_set_state,
|
|
||||||
&state);
|
|
||||||
#ifdef TORRENT_DEBUG
|
|
||||||
// if ((random() % 200) == 0) ret = 1;
|
|
||||||
#endif
|
|
||||||
if (ret != KERN_SUCCESS || (state & VM_PURGABLE_EMPTY))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "dec_block_refcount(piece=%d block=%d): "
|
|
||||||
"vm_purgable_control failed: %d state & VM_PURGABLE_EMPTY: %d\n"
|
|
||||||
, pe->piece, block, ret, state & VM_PURGABLE_EMPTY);
|
|
||||||
free_buffer(pe->blocks[block].buf);
|
|
||||||
pe->blocks[block].buf = NULL;
|
|
||||||
--pe->num_blocks;
|
|
||||||
--m_read_cache_size;
|
|
||||||
if (pe->cache_state == cached_piece_entry::volatile_read_lru)
|
|
||||||
--m_volatile_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#if TORRENT_USE_ASSERTS
|
#if TORRENT_USE_ASSERTS
|
||||||
switch (reason)
|
switch (reason)
|
||||||
|
|
|
@ -60,12 +60,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
#include <mach/mach.h>
|
|
||||||
// see comments at:
|
|
||||||
// http://www.opensource.apple.com/source/xnu/xnu-792.13.8/osfmk/vm/vm_object.c
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
|
@ -355,18 +349,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
#if defined TORRENT_DISABLE_POOL_ALLOCATOR
|
#if defined TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
kern_return_t res = vm_allocate(
|
|
||||||
mach_task_self(),
|
|
||||||
reinterpret_cast<vm_address_t*>(&ret),
|
|
||||||
0x4000,
|
|
||||||
VM_FLAGS_PURGABLE |
|
|
||||||
VM_FLAGS_ANYWHERE);
|
|
||||||
if (res != KERN_SUCCESS)
|
|
||||||
ret = NULL;
|
|
||||||
#else
|
|
||||||
ret = page_aligned_allocator::malloc(m_block_size);
|
ret = page_aligned_allocator::malloc(m_block_size);
|
||||||
#endif // TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
if (m_using_pool_allocator)
|
if (m_using_pool_allocator)
|
||||||
|
@ -641,15 +624,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
#if defined TORRENT_DISABLE_POOL_ALLOCATOR
|
#if defined TORRENT_DISABLE_POOL_ALLOCATOR
|
||||||
|
|
||||||
#if TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
vm_deallocate(
|
|
||||||
mach_task_self(),
|
|
||||||
reinterpret_cast<vm_address_t>(buf),
|
|
||||||
0x4000
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
page_aligned_allocator::free(buf);
|
page_aligned_allocator::free(buf);
|
||||||
#endif // TORRENT_USE_PURGABLE_CONTROL
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
if (m_using_pool_allocator)
|
if (m_using_pool_allocator)
|
||||||
|
|
Loading…
Reference in New Issue