MemoryPressureHandlerWin.cpp [plain text]
#include "config.h"
#include "MemoryPressureHandler.h"
#include <psapi.h>
#include <wtf/NeverDestroyed.h>
namespace WTF {
void MemoryPressureHandler::platformInitialize()
{
m_lowMemoryHandle = CreateMemoryResourceNotification(LowMemoryResourceNotification);
}
void MemoryPressureHandler::windowsMeasurementTimerFired()
{
setUnderMemoryPressure(false);
BOOL memoryLow;
if (QueryMemoryResourceNotification(m_lowMemoryHandle.get(), &memoryLow) && memoryLow) {
setUnderMemoryPressure(true);
releaseMemory(Critical::Yes);
return;
}
#if CPU(X86)
PROCESS_MEMORY_COUNTERS_EX counters;
if (!GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&counters), sizeof(counters)))
return;
const int maxMemoryUsageBytes = 0.9 * 1024 * 1024 * 1024;
if (counters.PrivateUsage > maxMemoryUsageBytes) {
setUnderMemoryPressure(true);
releaseMemory(Critical::Yes);
}
#endif
}
void MemoryPressureHandler::platformReleaseMemory(Critical)
{
}
void MemoryPressureHandler::install()
{
m_installed = true;
m_windowsMeasurementTimer.startRepeating(60.0);
}
void MemoryPressureHandler::uninstall()
{
if (!m_installed)
return;
m_windowsMeasurementTimer.stop();
m_installed = false;
}
void MemoryPressureHandler::holdOff(unsigned seconds)
{
}
void MemoryPressureHandler::respondToMemoryPressure(Critical critical, Synchronous synchronous)
{
uninstall();
releaseMemory(critical, synchronous);
}
std::optional<MemoryPressureHandler::ReliefLogger::MemoryUsage> MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
{
return std::nullopt;
}
}