diff --git Source/WTF/wtf/RAMSize.cpp Source/WTF/wtf/RAMSize.cpp index 5d34d3b..3dd516c 100644 --- Source/WTF/wtf/RAMSize.cpp +++ Source/WTF/wtf/RAMSize.cpp @@ -29,41 +29,61 @@ #include "StdLibExtras.h" #include <mutex> -#if OS(WINDOWS) +#if OS(DARWIN) +#import <dispatch/dispatch.h> +#import <mach/host_info.h> +#import <mach/mach.h> +#import <mach/mach_error.h> +#import <math.h> +#elif OS(UNIX) +#include <unistd.h> +#elif OS(WINDOWS) #include <windows.h> -#elif defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC -#if OS(UNIX) -#include <sys/sysinfo.h> -#endif // OS(UNIX) -#else -#include <bmalloc/bmalloc.h> #endif namespace WTF { -#if OS(WINDOWS) static const size_t ramSizeGuess = 512 * MB; -#endif static size_t computeRAMSize() { -#if OS(WINDOWS) +#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; + + 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; + } + + if (hostInfo.max_mem > std::numeric_limits<size_t>::max()) + return std::numeric_limits<size_t>::max(); + + size_t sizeAccordingToKernel = static_cast<size_t>(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(WINDOWS) MEMORYSTATUSEX status; status.dwLength = sizeof(status); bool result = GlobalMemoryStatusEx(&status); if (!result) return ramSizeGuess; return status.ullTotalPhys; -#elif defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC -#if OS(UNIX) - struct sysinfo si; - sysinfo(&si); - return si.totalram * si.mem_unit; -#else -#error "Missing a platform specific way of determining the available RAM" -#endif // OS(UNIX) -#else - return bmalloc::api::availableMemory(); #endif } @@ -77,4 +97,4 @@ size_t ramSize() return ramSize; } -} // namespace WTF +} // namespace WTF \ No newline at end of file