Unreviewed, rolling out r234489.
[WebKit-https.git] / Source / WTF / wtf / MemoryPressureHandler.cpp
index a6079c2..0f4fd09 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <wtf/MemoryFootprint.h>
 #include <wtf/NeverDestroyed.h>
+#include <wtf/RAMSize.h>
 
 #define LOG_CHANNEL_PREFIX Log
 
@@ -66,7 +67,7 @@ void MemoryPressureHandler::setShouldUsePeriodicMemoryMonitor(bool use)
 
     if (use) {
         m_measurementTimer = std::make_unique<RunLoop::Timer<MemoryPressureHandler>>(RunLoop::main(), this, &MemoryPressureHandler::measurementTimerFired);
-        m_measurementTimer->startRepeating(30);
+        m_measurementTimer->startRepeating(30_s);
     } else
         m_measurementTimer = nullptr;
 }
@@ -84,20 +85,17 @@ static const char* toString(MemoryUsagePolicy policy)
 
 static size_t thresholdForMemoryKillWithProcessState(WebsamProcessState processState, unsigned tabCount)
 {
+    size_t baseThreshold = 2 * GB;
 #if CPU(X86_64) || CPU(ARM64)
-    size_t baseThreshold;
     if (processState == WebsamProcessState::Active)
         baseThreshold = 4 * GB;
-    else
-        baseThreshold = 2 * GB;
-    if (tabCount <= 1)
-        return baseThreshold;
-    return baseThreshold + (std::min(tabCount - 1, 4u) * 1 * GB);
+    if (tabCount > 1)
+        baseThreshold += std::min(tabCount - 1, 4u) * 1 * GB;
 #else
-    UNUSED_PARAM(processState);
-    UNUSED_PARAM(tabCount);
-    return 3 * GB;
+    if ((tabCount > 1) || (processState == WebsamProcessState::Active))
+        baseThreshold = 3 * GB;
 #endif
+    return std::min(baseThreshold, static_cast<size_t>(ramSize() * 0.9));
 }
 
 void MemoryPressureHandler::setPageCount(unsigned pageCount)
@@ -114,12 +112,23 @@ size_t MemoryPressureHandler::thresholdForMemoryKill()
 
 static size_t thresholdForPolicy(MemoryUsagePolicy policy)
 {
+    const size_t baseThresholdForPolicy = std::min(3 * GB, ramSize());
+
+#if PLATFORM(IOS)
+    const double conservativeThresholdFraction = 0.5;
+    const double strictThresholdFraction = 0.65;
+#else
+    const double conservativeThresholdFraction = 0.33;
+    const double strictThresholdFraction = 0.5;
+#endif
+
     switch (policy) {
+    case MemoryUsagePolicy::Unrestricted:
+        return 0;
     case MemoryUsagePolicy::Conservative:
-        return 1 * GB;
+        return baseThresholdForPolicy * conservativeThresholdFraction;
     case MemoryUsagePolicy::Strict:
-        return 1.5 * GB;
-    case MemoryUsagePolicy::Unrestricted:
+        return baseThresholdForPolicy * strictThresholdFraction;
     default:
         ASSERT_NOT_REACHED();
         return 0;
@@ -135,6 +144,11 @@ static MemoryUsagePolicy policyForFootprint(size_t footprint)
     return MemoryUsagePolicy::Unrestricted;
 }
 
+MemoryUsagePolicy MemoryPressureHandler::currentMemoryUsagePolicy()
+{
+    return policyForFootprint(memoryFootprint().value_or(0));
+}
+
 void MemoryPressureHandler::shrinkOrDie()
 {
     RELEASE_LOG(MemoryPressure, "Process is above the memory kill threshold. Trying to shrink down.");
@@ -142,7 +156,7 @@ void MemoryPressureHandler::shrinkOrDie()
 
     auto footprint = memoryFootprint();
     RELEASE_ASSERT(footprint);
-    RELEASE_LOG(MemoryPressure, "New memory footprint: %lu MB", footprint.value() / MB);
+    RELEASE_LOG(MemoryPressure, "New memory footprint: %zu MB", footprint.value() / MB);
 
     if (footprint.value() < thresholdForMemoryKill()) {
         RELEASE_LOG(MemoryPressure, "Shrank below memory kill threshold. Process gets to live.");
@@ -150,6 +164,7 @@ void MemoryPressureHandler::shrinkOrDie()
         return;
     }
 
+    WTFLogAlways("Unable to shrink memory footprint of process (%zu MB) below the kill thresold (%zu MB). Killed\n", footprint.value() / MB, thresholdForMemoryKill() / MB);
     RELEASE_ASSERT(m_memoryKillCallback);
     m_memoryKillCallback();
 }
@@ -171,7 +186,7 @@ void MemoryPressureHandler::measurementTimerFired()
     if (!footprint)
         return;
 
-    RELEASE_LOG(MemoryPressure, "Current memory footprint: %lu MB", footprint.value() / MB);
+    RELEASE_LOG(MemoryPressure, "Current memory footprint: %zu MB", footprint.value() / MB);
     if (footprint.value() >= thresholdForMemoryKill()) {
         shrinkOrDie();
         return;
@@ -286,7 +301,6 @@ void MemoryPressureHandler::ReliefLogger::logMemoryUsageChange()
 #if !PLATFORM(COCOA) && !OS(LINUX) && !OS(WINDOWS)
 void MemoryPressureHandler::install() { }
 void MemoryPressureHandler::uninstall() { }
-void MemoryPressureHandler::holdOff(Seconds) { }
 void MemoryPressureHandler::respondToMemoryPressure(Critical, Synchronous) { }
 void MemoryPressureHandler::platformReleaseMemory(Critical) { }
 std::optional<MemoryPressureHandler::ReliefLogger::MemoryUsage> MemoryPressureHandler::ReliefLogger::platformMemoryUsage() { return std::nullopt; }