From dac8e20aade28443c27744ce421781be441a5bd1 Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Thu, 7 Aug 2014 23:05:47 +0300 Subject: [PATCH] Limit max cache to 1800MiB for 32bits compiled binaries and to 4GiB for other. Closes #1698. Conflicts: src/preferences/advancedsettings.h src/preferences/preferences.cpp --- src/preferences/advancedsettings.h | 10 +++++++++- src/preferences/preferences.h | 30 ++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/preferences/advancedsettings.h b/src/preferences/advancedsettings.h index 17aa8c8ba..464bb5616 100644 --- a/src/preferences/advancedsettings.h +++ b/src/preferences/advancedsettings.h @@ -178,7 +178,15 @@ private slots: const Preferences pref; // Disk write cache spin_cache.setMinimum(0); - spin_cache.setMaximum(2048); + // When build as 32bit binary, set the maximum at less than 2GB to prevent crashes. + // These macros may not be available on compilers other than MSVC and GCC +#if !defined(_M_X64) || !defined(__amd64__) + //1800MiB to leave 248MiB room to the rest of program data in RAM + spin_cache.setMaximum(1800); +#else + // 4GiB + spin_cache.setMaximum(4*1024); +#endif spin_cache.setValue(pref.diskCacheSize()); updateCacheSpinSuffix(spin_cache.value()); setRow(DISK_CACHE, tr("Disk write cache size"), &spin_cache); diff --git a/src/preferences/preferences.h b/src/preferences/preferences.h index 665230d84..14b7a6d66 100755 --- a/src/preferences/preferences.h +++ b/src/preferences/preferences.h @@ -985,14 +985,40 @@ public: uint diskCacheSize() const { #if LIBTORRENT_VERSION_NUM >= 1610 - return value(QString::fromUtf8("Preferences/Downloads/DiskWriteCacheSize"), 0).toUInt(); + uint size = value(QString::fromUtf8("Preferences/Downloads/DiskWriteCacheSize"), 0).toUInt(); + + // When build as 32bit binary, set the maximum at less than 2GB to prevent crashes. + // These macros may not be available on compilers other than MSVC and GCC +#if !defined(_M_X64) || !defined(__amd64__) + //1800MiB to leave 248MiB room to the rest of program data in RAM + if (size > 1800) + size = 1800; +#else + // 4GiB + if (size > 4*1024) + size = 4*1024; +#endif + + return size; #else return value(QString::fromUtf8("Preferences/Downloads/DiskWriteCacheSize"), 128).toUInt(); #endif } void setDiskCacheSize(uint size) { - setValue(QString::fromUtf8("Preferences/Downloads/DiskWriteCacheSize"), size); + uint size0 = size; + +#if !defined(_M_X64) || !defined(__amd64__) + //1800MiB to leave 248MiB room to the rest of program data in RAM + if (size0 > 1800) + size0 = 1800; +#else + // 4GiB + if (size0 > 4*1024) + size0 = 4*1024; +#endif + + setValue(QString::fromUtf8("Preferences/Downloads/DiskWriteCacheSize"), size0); } #if LIBTORRENT_VERSION_NUM >= 1610