/* * Copyright (C) 2012-2019 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include #include #if OS(WINDOWS) #include #elif defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC #if OS(HAIKU) #include #elif OS(LINUX) #include #elif OS(UNIX) #include #endif // OS(LINUX) || OS(UNIX) #else #include #endif namespace WTF { #if OS(WINDOWS) static constexpr size_t ramSizeGuess = 512 * MB; #endif static size_t computeRAMSize() { #if OS(WINDOWS) MEMORYSTATUSEX status; status.dwLength = sizeof(status); bool result = GlobalMemoryStatusEx(&status); if (!result) return ramSizeGuess; return status.ullTotalPhys; #elif USE(SYSTEM_MALLOC) #if OS(LINUX) || OS(FREEBSD) struct sysinfo si; sysinfo(&si); return si.totalram * si.mem_unit; #elif OS(UNIX) long pages = sysconf(_SC_PHYS_PAGES); long pageSize = sysconf(_SC_PAGE_SIZE); return pages * pageSize; #elif OS(HAIKU) system_info si; get_system_info(&si); return si.max_pages * B_PAGE_SIZE; #else #error "Missing a platform specific way of determining the available RAM" #endif // OS(LINUX) || OS(FREEBSD) || OS(UNIX) #else return bmalloc::api::availableMemory(); #endif } size_t ramSize() { static size_t ramSize; static std::once_flag onceFlag; std::call_once(onceFlag, [] { ramSize = computeRAMSize(); }); return ramSize; } } // namespace WTF