From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WTF/wtf/RAMSize.cpp | 57 ++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 22 deletions(-) (limited to 'Source/WTF/wtf/RAMSize.cpp') diff --git a/Source/WTF/wtf/RAMSize.cpp b/Source/WTF/wtf/RAMSize.cpp index 50b5222ea..deb69e188 100644 --- a/Source/WTF/wtf/RAMSize.cpp +++ b/Source/WTF/wtf/RAMSize.cpp @@ -27,10 +27,14 @@ #include "RAMSize.h" #include "StdLibExtras.h" +#include + #if OS(DARWIN) -#include -#include -#include +#import +#import +#import +#import +#import #elif OS(UNIX) #include #elif OS(WINDOWS) @@ -39,35 +43,40 @@ namespace WTF { -static const size_t ramSizeGuess = 128 * MB; +static const size_t ramSizeGuess = 512 * MB; static size_t computeRAMSize() { -#if OS(DARWIN) - int mib[2]; - uint64_t ramSize; - size_t length; +#if PLATFORM(IOS_SIMULATOR) + // Pretend we have 512MB of memory to make cache sizes behave like on device. + return ramSizeGuess; +#elif OS(DARWIN) + host_basic_info_data_t hostInfo; - mib[0] = CTL_HW; - mib[1] = HW_MEMSIZE; - length = sizeof(int64_t); - int sysctlResult = sysctl(mib, 2, &ramSize, &length, 0, 0); - if (sysctlResult == -1) + mach_port_t host = mach_host_self(); + mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT; + kern_return_t r = host_info(host, HOST_BASIC_INFO, (host_info_t)&hostInfo, &count); + mach_port_deallocate(mach_task_self(), host); + if (r != KERN_SUCCESS) { + LOG_ERROR("%s : host_info(%d) : %s.\n", __FUNCTION__, r, mach_error_string(r)); return ramSizeGuess; - return ramSize > std::numeric_limits::max() ? std::numeric_limits::max() : static_cast(ramSize); + } + + if (hostInfo.max_mem > std::numeric_limits::max()) + return std::numeric_limits::max(); + + size_t sizeAccordingToKernel = static_cast(hostInfo.max_mem); + size_t multiple = 128 * MB; + + // Round up the memory size to a multiple of 128MB because max_mem may not be exactly 512MB + // (for example) and we have code that depends on those boundaries. + return ((sizeAccordingToKernel + multiple - 1) / multiple) * multiple; #elif OS(UNIX) long pages = sysconf(_SC_PHYS_PAGES); long pageSize = sysconf(_SC_PAGE_SIZE); if (pages == -1 || pageSize == -1) return ramSizeGuess; return pages * pageSize; -#elif OS(WINCE) - MEMORYSTATUS status; - status.dwLength = sizeof(status); - GlobalMemoryStatus(&status); - if (status.dwTotalPhys <= 0) - return ramSizeGuess; - return status.dwTotalPhys; #elif OS(WINDOWS) MEMORYSTATUSEX status; status.dwLength = sizeof(status); @@ -80,7 +89,11 @@ static size_t computeRAMSize() size_t ramSize() { - static const size_t ramSize = computeRAMSize(); + static size_t ramSize; + static std::once_flag onceFlag; + std::call_once(onceFlag, [] { + ramSize = computeRAMSize(); + }); return ramSize; } -- cgit v1.2.1