diff options
author | rmcilroy@chromium.org <rmcilroy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-01 01:55:39 +0000 |
---|---|---|
committer | rmcilroy@chromium.org <rmcilroy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-01 01:55:39 +0000 |
commit | 69516cafc328c5080672cfa97e92dd8fbbcf64de (patch) | |
tree | 838e27fe8ac595b3628fc4a47f01fa58b86fc70c /base/sys_info_linux.cc | |
parent | 88ac22b46582c70db679c2b4a695ec301e98c67f (diff) | |
download | chromium_src-69516cafc328c5080672cfa97e92dd8fbbcf64de.zip chromium_src-69516cafc328c5080672cfa97e92dd8fbbcf64de.tar.gz chromium_src-69516cafc328c5080672cfa97e92dd8fbbcf64de.tar.bz2 |
Reland "Enable SysInfo::AmountOfPhysicalMemory to be called from within the Linux Sandbox"
Trigger caching of SysInfo::AmountOfPhysicalMemory in PreSandboxInit() to enable
it to be called by the renderer process after the sandbox is sealed.
BUG=312241
Review URL: https://codereview.chromium.org/52403002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232274 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/sys_info_linux.cc')
-rw-r--r-- | base/sys_info_linux.cc | 70 |
1 files changed, 47 insertions, 23 deletions
diff --git a/base/sys_info_linux.cc b/base/sys_info_linux.cc index acc4771..fe242b0 100644 --- a/base/sys_info_linux.cc +++ b/base/sys_info_linux.cc @@ -7,6 +7,7 @@ #include <limits> #include "base/file_util.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" @@ -22,41 +23,64 @@ int64 AmountOfMemory(int pages_name) { return static_cast<int64>(pages) * page_size; } +size_t MaxSharedMemorySize() { + std::string contents; + base::ReadFileToString(base::FilePath("/proc/sys/kernel/shmmax"), &contents); + DCHECK(!contents.empty()); + if (!contents.empty() && contents[contents.length() - 1] == '\n') { + contents.erase(contents.length() - 1); + } + + int64 limit; + if (!base::StringToInt64(contents, &limit)) { + limit = 0; + } + if (limit < 0 || + static_cast<uint64>(limit) > std::numeric_limits<size_t>::max()) { + limit = 0; + } + DCHECK(limit > 0); + return static_cast<size_t>(limit); +} + +class LazySysInfo { + public: + LazySysInfo() + : kPhysicalMemory_(AmountOfMemory(_SC_PHYS_PAGES)), + kMaxSharedMemorySize_(MaxSharedMemorySize()) { } + + ~LazySysInfo() { } + + int64 physical_memory() { return kPhysicalMemory_; } + size_t max_shared_memory_size() { return kMaxSharedMemorySize_; } + + private: + const int64 kPhysicalMemory_; + const size_t kMaxSharedMemorySize_; + + DISALLOW_COPY_AND_ASSIGN(LazySysInfo); +}; + +base::LazyInstance<LazySysInfo>::Leaky + g_lazy_sys_info = LAZY_INSTANCE_INITIALIZER; + } // namespace namespace base { // static -int64 SysInfo::AmountOfPhysicalMemory() { - return AmountOfMemory(_SC_PHYS_PAGES); +int64 SysInfo::AmountOfAvailablePhysicalMemory() { + return AmountOfMemory(_SC_AVPHYS_PAGES); } // static -int64 SysInfo::AmountOfAvailablePhysicalMemory() { - return AmountOfMemory(_SC_AVPHYS_PAGES); +int64 SysInfo::AmountOfPhysicalMemory() { + return g_lazy_sys_info.Get().physical_memory(); } // static size_t SysInfo::MaxSharedMemorySize() { - static int64 limit; - static bool limit_valid = false; - if (!limit_valid) { - std::string contents; - ReadFileToString(FilePath("/proc/sys/kernel/shmmax"), &contents); - DCHECK(!contents.empty()); - if (!contents.empty() && contents[contents.length() - 1] == '\n') { - contents.erase(contents.length() - 1); - } - if (base::StringToInt64(contents, &limit)) { - DCHECK(limit >= 0); - DCHECK(static_cast<uint64>(limit) <= std::numeric_limits<size_t>::max()); - limit_valid = true; - } else { - NOTREACHED(); - return 0; - } - } - return static_cast<size_t>(limit); + return g_lazy_sys_info.Get().max_shared_memory_size(); } // static |