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