Index: base/sys_info_linux.cc |
diff --git a/base/sys_info_linux.cc b/base/sys_info_linux.cc |
index 298d245ecf580da4d8790f5dc47f851c0208ab5d..0cd05b363a23e34ae270ececb8c995305cd3eded 100644 |
--- a/base/sys_info_linux.cc |
+++ b/base/sys_info_linux.cc |
@@ -13,6 +13,7 @@ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/numerics/safe_conversions.h" |
+#include "base/process/process_metrics.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/sys_info_internal.h" |
#include "build/build_config.h" |
@@ -42,13 +43,29 @@ base::LazyInstance< |
namespace base { |
// static |
+int64_t SysInfo::AmountOfPhysicalMemory() { |
+ return g_lazy_physical_memory.Get().value(); |
+} |
+ |
+// static |
int64_t SysInfo::AmountOfAvailablePhysicalMemory() { |
- return AmountOfMemory(_SC_AVPHYS_PAGES); |
+ SystemMemoryInfoKB info; |
+ if (!GetSystemMemoryInfo(&info)) |
+ return 0; |
+ return AmountOfAvailablePhysicalMemory(info); |
} |
// static |
-int64_t SysInfo::AmountOfPhysicalMemory() { |
- return g_lazy_physical_memory.Get().value(); |
+int64_t SysInfo::AmountOfAvailablePhysicalMemory( |
+ const SystemMemoryInfoKB& info) { |
+ // See details here: |
+ // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 |
+ // The fallback logic (when there is no MemAvailable) would be more precise |
+ // if we had info about zones watermarks (/proc/zoneinfo). |
+ int64_t res_kb = info.available != 0 |
+ ? info.available - info.active_file |
+ : info.free + info.reclaimable + info.inactive_file; |
+ return res_kb * 1024; |
} |
// static |