forward port fix to not auto-detect disk cache size greater than the virtual address space for 32 bit builds

This commit is contained in:
arvidn 2015-11-07 22:00:20 -05:00
parent 61138630a3
commit 9c10e99aef
3 changed files with 14 additions and 53 deletions

View File

@ -78,6 +78,8 @@
1.0.7 release 1.0.7 release
* fix bug where 32 bit builds could use more disk cache than the virtual
address space (when set to automatic)
* fix support for torrents with > 500'000 pieces * fix support for torrents with > 500'000 pieces
* fix ip filter bug when banning peers * fix ip filter bug when banning peers
* fix IPv6 IP address resolution in URLs * fix IPv6 IP address resolution in URLs

View File

@ -39,6 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/alert.hpp" #include "libtorrent/alert.hpp"
#include "libtorrent/alert_types.hpp" #include "libtorrent/alert_types.hpp"
#include "libtorrent/disk_observer.hpp" #include "libtorrent/disk_observer.hpp"
#include "libtorrent/platform_util.hpp" // for total_physical_ram
#include "libtorrent/aux_/disable_warnings_push.hpp" #include "libtorrent/aux_/disable_warnings_push.hpp"
@ -459,57 +460,6 @@ namespace libtorrent
check_buffer_level(l); check_buffer_level(l);
} }
namespace {
boost::uint64_t physical_ram()
{
boost::uint64_t ret = 0;
// figure out how much physical RAM there is in
// this machine. This is used for automatically
// sizing the disk cache size when it's set to
// automatic.
#ifdef TORRENT_BSD
#ifdef HW_MEMSIZE
int mib[2] = { CTL_HW, HW_MEMSIZE };
#else
// not entirely sure this sysctl supports 64
// bit return values, but it's probably better
// than not building
int mib[2] = { CTL_HW, HW_PHYSMEM };
#endif
size_t len = sizeof(ret);
if (sysctl(mib, 2, &ret, &len, NULL, 0) != 0)
ret = 0;
#elif defined TORRENT_WINDOWS
MEMORYSTATUSEX ms;
ms.dwLength = sizeof(MEMORYSTATUSEX);
if (GlobalMemoryStatusEx(&ms))
ret = ms.ullTotalPhys;
else
ret = 0;
#elif defined TORRENT_LINUX
ret = sysconf(_SC_PHYS_PAGES);
ret *= sysconf(_SC_PAGESIZE);
#elif defined TORRENT_AMIGA
ret = AvailMem(MEMF_PUBLIC);
#endif
#if TORRENT_USE_RLIMIT
if (ret > 0)
{
struct rlimit r;
if (getrlimit(rlimit_as, &r) == 0 && r.rlim_cur != rlim_infinity)
{
if (ret > r.rlim_cur)
ret = r.rlim_cur;
}
}
#endif
return ret;
}
} // anonymous namespace
void disk_buffer_pool::set_settings(aux::session_settings const& sett void disk_buffer_pool::set_settings(aux::session_settings const& sett
, error_code& ec) , error_code& ec)
{ {
@ -543,9 +493,18 @@ namespace libtorrent
int cache_size = sett.get_int(settings_pack::cache_size); int cache_size = sett.get_int(settings_pack::cache_size);
if (cache_size < 0) if (cache_size < 0)
{ {
boost::uint64_t phys_ram = physical_ram(); boost::uint64_t phys_ram = total_physical_ram();
if (phys_ram == 0) m_max_use = 1024; if (phys_ram == 0) m_max_use = 1024;
else m_max_use = phys_ram / 8 / m_block_size; else m_max_use = phys_ram / 8 / m_block_size;
if (sizeof(void*) == 4)
{
// 32 bit builds should capped below 2 GB of memory, even
// when more actual ram is available, because we're still
// constrained by the 32 bit virtual address space.
m_max_use = (std::min)(1 * 1024
* 1024 * 1024 / m_block_size, m_max_use);
}
} }
else else
{ {

View File

@ -35,7 +35,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/assert.hpp" #include "libtorrent/assert.hpp"
#include "libtorrent/settings_pack.hpp" #include "libtorrent/settings_pack.hpp"
#include "libtorrent/aux_/session_impl.hpp" #include "libtorrent/aux_/session_impl.hpp"
#include "libtorrent/platform_util.hpp" // for total_physical_ram //#include "libtorrent/platform_util.hpp" // for total_physical_ram
#include <algorithm> #include <algorithm>