Title: [294405] trunk/Source/WebKit
Revision
294405
Author
sihui_...@apple.com
Date
2022-05-18 10:51:25 -0700 (Wed, 18 May 2022)

Log Message

Monitor process state and send prepareToSuspend based on that
https://bugs.webkit.org/show_bug.cgi?id=240359

Reviewed by Chris Dumez.

Currently UI process sends PrepareToSuspend when a process has no activity that needs an assertion, or when
assertion will be invalidated due to timeout (when assertionWillInvalidate is called). On receiving PrepareToSuspend,
process will perform necessary actions, such as suspending storage threads for network process. According to crashes in
rdar://problem/92228190, the message is not received by process before suspension, or process gets suspended while
processing the message. To fix the crash, we need to ensure the message gets processed before process suspension.

This patch introduces ProcessStateMonitor that tracks when UI process will be suspended, and notifies WebProcessPools
when remaining running time is less than 15s. On receiving the notification, ProcessThrottlers of web processes will
invalidate activities and send out PrepareToSuspend messages to web processes. These processes are not allowed to take
new background assertion until ProcessStateMonitor finds process becomes running without timeout, or ProcessStateMonitor
is destroyed. ProcessStateMonitor is created when UI process enters background, and destroyed when UI process enters
foreground, to avoid getting receiving too many unnecessary updates from runningboardd.

* Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h:
(+[RBSProcessPredicate predicateMatchingHandle:]):
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::setProcessesShouldSuspend):
* Source/WebKit/UIProcess/ProcessThrottler.cpp:
(WebKit::ProcessThrottler::addActivity):
(WebKit::ProcessThrottler::setAllowsActivities):
* Source/WebKit/UIProcess/ProcessThrottler.h:
(WebKit::ProcessThrottler::Activity::Activity):
(WebKit::ProcessThrottler::Activity::name const):
(WebKit::ProcessThrottler::Activity::isQuietActivity const):
* Source/WebKit/UIProcess/WebProcessPool.h:
* Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm:
(-[WKProcessAssertionBackgroundTaskManager init]):
(-[WKProcessAssertionBackgroundTaskManager _releaseBackgroundTask]):
* Source/WebKit/UIProcess/ios/ProcessStateMonitor.h: Added.
* Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm: Added.
(WebKit::ProcessStateMonitor::ProcessStateMonitor):
(WebKit::ProcessStateMonitor::~ProcessStateMonitor):
(WebKit::ProcessStateMonitor::processDidBecomeRunning):
(WebKit::ProcessStateMonitor::processWillBeSuspended):
(WebKit::ProcessStateMonitor::processWillBeSuspendedImmediately):
(WebKit::ProcessStateMonitor::suspendTimerFired):
(WebKit::ProcessStateMonitor::checkRemainingRunTime):
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:

Canonical link: https://commits.webkit.org/250699@main

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h (294404 => 294405)


--- trunk/Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h	2022-05-18 17:51:25 UTC (rev 294405)
@@ -131,14 +131,24 @@
 
 @interface RBSProcessMonitor : NSObject <NSCopying>
 + (instancetype)monitorWithConfiguration:(NS_NOESCAPE RBSProcessMonitorConfigurator)block;
+- (void)invalidate;
 @end
 
 @interface RBSProcessPredicate : NSObject <RBSProcessMatching>
 + (RBSProcessPredicate *)predicateMatchingHandle:(RBSProcessHandle *)process;
+typedef NS_OPTIONS(NSUInteger, RBSProcessStateValues) {
+    RBSProcessStateValueNone                    = 0,
+    RBSProcessStateValueTaskState               = (1 << 0),
+    RBSProcessStateValueTags                    = (1 << 1),
+    RBSProcessStateValueTerminationResistance   = (1 << 2),
+    RBSProcessStateValueLegacyAssertions        = (1 << 3),
+    RBSProcessStateValueModernAssertions        = (1 << 4),
+};
 @end
 
 @interface RBSProcessStateDescriptor : NSObject <NSCopying>
 + (instancetype)descriptor;
+@property (nonatomic, readwrite, assign) RBSProcessStateValues values;
 @property (nonatomic, readwrite, copy, nullable) NSArray<NSString *> *endowmentNamespaces;
 @end
 

Modified: trunk/Source/WebKit/SourcesCocoa.txt (294404 => 294405)


--- trunk/Source/WebKit/SourcesCocoa.txt	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/SourcesCocoa.txt	2022-05-18 17:51:25 UTC (rev 294405)
@@ -491,6 +491,7 @@
 UIProcess/ios/InputViewUpdateDeferrer.mm
 UIProcess/ios/PageClientImplIOS.mm
 UIProcess/ios/ProcessAssertionIOS.mm
+UIProcess/ios/ProcessStateMonitor.mm
 UIProcess/ios/SmartMagnificationController.mm
 UIProcess/ios/TextCheckerIOS.mm
 UIProcess/ios/ViewGestureControllerIOS.mm

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (294404 => 294405)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2022-05-18 17:51:25 UTC (rev 294405)
@@ -38,6 +38,7 @@
 #import "NetworkProcessMessages.h"
 #import "NetworkProcessProxy.h"
 #import "PreferenceObserver.h"
+#import "ProcessThrottler.h"
 #import "SandboxUtilities.h"
 #import "TextChecker.h"
 #import "UserInterfaceIdiom.h"
@@ -1051,6 +1052,15 @@
     for (auto& processPool : allProcessPools())
         processPool->applicationIsAboutToSuspend();
 }
+
+void WebProcessPool::setProcessesShouldSuspend(bool shouldSuspend)
+{
+    WEBPROCESSPOOL_RELEASE_LOG(ProcessSuspension, "setProcessesShouldSuspend: Processes should suspend %d", shouldSuspend);
+
+    for (auto& process : m_processes)
+        process->throttler().setAllowsActivities(!shouldSuspend);
+}
+
 #endif
 
 void WebProcessPool::initializeClassesForParameterCoding()

Modified: trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp (294404 => 294405)


--- trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp	2022-05-18 17:51:25 UTC (rev 294405)
@@ -52,16 +52,30 @@
     invalidateAllActivities();
 }
 
-void ProcessThrottler::addActivity(ForegroundActivity& activity)
+bool ProcessThrottler::addActivity(ForegroundActivity& activity)
 {
+    if (!m_allowsActivities) {
+        if (!activity.isQuietActivity())
+            PROCESSTHROTTLER_RELEASE_LOG("addActivity: not allowed to add foreground activity %s", activity.name().characters());
+        return false;
+    }
+
     m_foregroundActivities.add(&activity);
     updateAssertionIfNeeded();
+    return true;
 }
 
-void ProcessThrottler::addActivity(BackgroundActivity& activity)
+bool ProcessThrottler::addActivity(BackgroundActivity& activity)
 {
+    if (!m_allowsActivities) {
+        if (!activity.isQuietActivity())
+            PROCESSTHROTTLER_RELEASE_LOG("addActivity: not allowed to add background activity %s", activity.name().characters());
+        return false;
+    }
+
     m_backgroundActivities.add(&activity);
     updateAssertionIfNeeded();
+    return true;
 }
 
 void ProcessThrottler::removeActivity(ForegroundActivity& activity)
@@ -257,6 +271,18 @@
     return std::get<UniqueRef<ProcessThrottler::ForegroundActivity>>(activity)->isValid();
 }
 
+void ProcessThrottler::setAllowsActivities(bool allow)
+{
+    if (m_allowsActivities == allow)
+        return;
+
+    PROCESSTHROTTLER_RELEASE_LOG("setAllowsActivities %d", allow);
+    m_allowsActivities = allow;
+
+    if (!allow)
+        invalidateAllActivities();
+}
+
 ProcessThrottler::TimedActivity::TimedActivity(Seconds timeout, ProcessThrottler::ActivityVariant&& activity)
     : m_timer(RunLoop::main(), this, &TimedActivity::activityTimedOut)
     , m_timeout(timeout)

Modified: trunk/Source/WebKit/UIProcess/ProcessThrottler.h (294404 => 294405)


--- trunk/Source/WebKit/UIProcess/ProcessThrottler.h	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/ProcessThrottler.h	2022-05-18 17:51:25 UTC (rev 294405)
@@ -64,7 +64,11 @@
             : m_throttler(&throttler)
             , m_name(name)
         {
-            throttler.addActivity(*this);
+            if (!throttler.addActivity(*this)) {
+                m_throttler = nullptr;
+                return;
+            }
+
             if (!isQuietActivity()) {
                 PROCESSTHROTTLER_ACTIVITY_RELEASE_LOG("Activity: Starting %" PUBLIC_LOG_STRING " activity / '%" PUBLIC_LOG_STRING "'",
                     type == ActivityType::Foreground ? "foreground" : "background", m_name.characters());
@@ -78,12 +82,12 @@
         }
 
         bool isValid() const { return !!m_throttler; }
+        ASCIILiteral name() const { return m_name; }
+        bool isQuietActivity() const { return !m_name.characters(); }
 
     private:
         friend class ProcessThrottler;
 
-        bool isQuietActivity() const { return !m_name.characters(); }
-
         void invalidate()
         {
             ASSERT(isValid());
@@ -125,6 +129,7 @@
     
     void didConnectToProcess(ProcessID);
     bool shouldBeRunnable() const { return m_foregroundActivities.size() || m_backgroundActivities.size(); }
+    void setAllowsActivities(bool);
 
 private:
     ProcessAssertionType expectedAssertionType();
@@ -135,8 +140,8 @@
     void sendPrepareToSuspendIPC(IsSuspensionImminent);
     void processReadyToSuspend();
 
-    void addActivity(ForegroundActivity&);
-    void addActivity(BackgroundActivity&);
+    bool addActivity(ForegroundActivity&);
+    bool addActivity(BackgroundActivity&);
     void removeActivity(ForegroundActivity&);
     void removeActivity(BackgroundActivity&);
     void invalidateAllActivities();
@@ -155,6 +160,7 @@
     HashSet<BackgroundActivity*> m_backgroundActivities;
     std::optional<uint64_t> m_pendingRequestToSuspendID;
     bool m_shouldTakeUIBackgroundAssertion;
+    bool m_allowsActivities { true };
 };
 
 inline auto ProcessThrottler::foregroundActivity(ASCIILiteral name) -> UniqueRef<ForegroundActivity>

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (294404 => 294405)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2022-05-18 17:51:25 UTC (rev 294405)
@@ -236,6 +236,7 @@
 #if PLATFORM(IOS_FAMILY)
     void applicationIsAboutToSuspend();
     static void notifyProcessPoolsApplicationIsAboutToSuspend();
+    void setProcessesShouldSuspend(bool);
 #endif
 
     void handleMemoryPressureWarning(Critical);

Modified: trunk/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm (294404 => 294405)


--- trunk/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm	2022-05-18 17:51:25 UTC (rev 294405)
@@ -29,6 +29,7 @@
 #if PLATFORM(IOS_FAMILY)
 
 #import "Logging.h"
+#import "ProcessStateMonitor.h"
 #import "RunningBoardServicesSPI.h"
 #import "WebProcessPool.h"
 #import <UIKit/UIApplication.h>
@@ -73,6 +74,7 @@
     std::atomic<bool> _backgroundTaskWasInvalidated;
     WeakHashSet<ProcessAndUIAssertion> _assertionsNeedingBackgroundTask;
     dispatch_block_t _pendingTaskReleaseTask;
+    std::unique_ptr<WebKit::ProcessStateMonitor> m_processStateMonitor;
 }
 
 + (WKProcessAssertionBackgroundTaskManager *)shared
@@ -92,11 +94,20 @@
     [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:^(NSNotification *) {
         [self _cancelPendingReleaseTask];
         [self _updateBackgroundTask];
+
+        m_processStateMonitor = nullptr;
     }];
 
     [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:^(NSNotification *) {
         if (![self _hasBackgroundTask])
             WebKit::WebProcessPool::notifyProcessPoolsApplicationIsAboutToSuspend();
+
+        if (!m_processStateMonitor) {
+            m_processStateMonitor = makeUnique<WebKit::ProcessStateMonitor>([](bool suspended) {
+                for (auto& processPool : WebKit::WebProcessPool::allProcessPools())
+                    processPool->setProcessesShouldSuspend(suspended);
+            });
+        }
     }];
 
     return self;
@@ -242,8 +253,11 @@
         return;
 
     RELEASE_LOG(ProcessSuspension, "%p - WKProcessAssertionBackgroundTaskManager: endBackgroundTask", self);
-    if (processHasActiveRunTimeLimitation())
+    if (processHasActiveRunTimeLimitation()) {
         WebKit::WebProcessPool::notifyProcessPoolsApplicationIsAboutToSuspend();
+        if (m_processStateMonitor)
+            m_processStateMonitor->processWillBeSuspendedImmediately();
+    }
 
     [_backgroundTask removeObserver:self];
     [_backgroundTask invalidate];

Added: trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.h (0 => 294405)


--- trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.h	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.h	2022-05-18 17:51:25 UTC (rev 294405)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+#pragma once
+
+#if PLATFORM(IOS_FAMILY)
+
+#import <wtf/RetainPtr.h>
+#import <wtf/RunLoop.h>
+
+OBJC_CLASS RBSProcessMonitor;
+
+namespace WebKit {
+
+class ProcessStateMonitor : public CanMakeWeakPtr<ProcessStateMonitor> {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    ProcessStateMonitor(Function<void(bool)>&& becomeSuspendedHandler);
+    ~ProcessStateMonitor();
+    void processWillBeSuspendedImmediately();
+
+private:
+    void processDidBecomeRunning();
+    void processWillBeSuspended(Seconds timeout);
+    void suspendTimerFired();
+    void checkRemainingRunTime();
+
+    enum class State : uint8_t { Running, WillSuspend, Suspended };
+    State m_state { State::Running };
+    Function<void(bool)> m_becomeSuspendedHandler;
+    RunLoop::Timer<ProcessStateMonitor> m_suspendTimer;
+    RetainPtr<RBSProcessMonitor> m_rbsMonitor;
+};
+
+} // namespace WebKit
+
+#endif // PLATFORM(IOS_FAMILY)

Added: trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm (0 => 294405)


--- trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm	2022-05-18 17:51:25 UTC (rev 294405)
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+#import "config.h"
+#import "ProcessStateMonitor.h"
+
+#if PLATFORM(IOS_FAMILY)
+
+#import "Logging.h"
+#import "NetworkProcessMessages.h"
+#import "ProcessAssertion.h"
+#import "RunningBoardServicesSPI.h"
+
+namespace WebKit {
+
+static constexpr double maxPrepareForSuspensionDelayInSecond = 15;
+
+ProcessStateMonitor::ProcessStateMonitor(Function<void(bool)>&& becomeSuspendedHandler)
+    : m_becomeSuspendedHandler(WTFMove(becomeSuspendedHandler))
+    , m_suspendTimer(RunLoop::main(), [this] { suspendTimerFired(); })
+{
+    RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::ProcessStateMonitor", this);
+    RELEASE_ASSERT(RunLoop::isMain());
+
+    m_rbsMonitor = [RBSProcessMonitor monitorWithConfiguration:[weakThis = WeakPtr { *this }](id<RBSProcessMonitorConfiguring> config) mutable {
+        RBSProcessStateDescriptor *descriptor = [RBSProcessStateDescriptor descriptor];
+        [descriptor setValues:RBSProcessStateValueLegacyAssertions | RBSProcessStateValueModernAssertions];
+        [config setStateDescriptor:descriptor];
+        [config setPredicates:@[[RBSProcessPredicate predicateMatchingHandle:[RBSProcessHandle currentProcess]]]];
+        [config setUpdateHandler:[weakThis = WTFMove(weakThis)](RBSProcessMonitor *monitor, RBSProcessHandle *process, RBSProcessStateUpdate *update) {
+            ensureOnMainRunLoop([weakThis] {
+                if (weakThis)
+                    weakThis->checkRemainingRunTime();
+            });
+        }];
+    }];
+
+    checkRemainingRunTime();
+}
+
+ProcessStateMonitor::~ProcessStateMonitor()
+{
+    RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::~ProcessStateMonitor", this);
+    RELEASE_ASSERT(RunLoop::isMain());
+
+    [m_rbsMonitor.get() invalidate];
+    processDidBecomeRunning();
+}
+
+void ProcessStateMonitor::processDidBecomeRunning()
+{
+    if (m_state == State::Running)
+        return;
+
+    if (m_state == State::Suspended)
+        m_becomeSuspendedHandler(false);
+    else {
+        ASSERT(m_suspendTimer.isActive());
+        m_suspendTimer.stop();
+    }
+
+    m_state = State::Running;
+}
+
+void ProcessStateMonitor::processWillBeSuspended(Seconds timeout)
+{
+    if (m_state != State::Running)
+        return;
+
+    RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::processWillBeSuspended starts timer for %fs", this, timeout.value());
+    ASSERT(!m_suspendTimer.isActive());
+    m_suspendTimer.startOneShot(timeout);
+    m_state = State::WillSuspend;
+}
+
+void ProcessStateMonitor::processWillBeSuspendedImmediately()
+{
+    if (m_state == State::Suspended)
+        return;
+
+    RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::processWillBeSuspendedImmediately", this);
+    m_suspendTimer.stop();
+    m_becomeSuspendedHandler(true);
+    m_state = State::Suspended;
+}
+
+void ProcessStateMonitor::suspendTimerFired()
+{
+    if (m_state != State::WillSuspend)
+        return;
+
+    RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::suspendTimerFired", this);
+    processWillBeSuspendedImmediately();
+}
+
+void ProcessStateMonitor::checkRemainingRunTime()
+{
+    double remainingRunTime = [[[RBSProcessHandle currentProcess] activeLimitations] runTime];
+    if (remainingRunTime == RBSProcessTimeLimitationNone)
+        return processDidBecomeRunning();
+
+    if (remainingRunTime <= maxPrepareForSuspensionDelayInSecond)
+        return processWillBeSuspendedImmediately();
+
+    processWillBeSuspended(Seconds(remainingRunTime - maxPrepareForSuspensionDelayInSecond));
+}
+
+} // namespace WebKit
+
+#endif // PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (294404 => 294405)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2022-05-18 17:51:25 UTC (rev 294405)
@@ -1511,6 +1511,7 @@
 		93D6B7B4255268D50058DD3A /* SpeechRecognitionPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B7AF255268A10058DD3A /* SpeechRecognitionPermissionRequest.h */; };
 		93D6B7B5255268D70058DD3A /* SpeechRecognitionPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B7B2255268A20058DD3A /* SpeechRecognitionPermissionManager.h */; };
 		93D6B7B925534A170058DD3A /* WKSpeechRecognitionPermissionCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B7B725534A110058DD3A /* WKSpeechRecognitionPermissionCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		93E05E40282CD560000B69EB /* ProcessStateMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E05E3E282CD55D000B69EB /* ProcessStateMonitor.h */; };
 		93E6A4EE1BC5DD3900F8A0E7 /* _WKHitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E6A4ED1BC5DD3900F8A0E7 /* _WKHitTestResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		93E799852756FA550074008A /* WebFileSystemStorageConnectionMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93E799822756FA540074008A /* WebFileSystemStorageConnectionMessageReceiver.cpp */; };
 		93E799872756FAB40074008A /* WebFileSystemStorageConnectionMessagesReplies.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799832756FA540074008A /* WebFileSystemStorageConnectionMessagesReplies.h */; };
@@ -5831,6 +5832,8 @@
 		93D6B7B2255268A20058DD3A /* SpeechRecognitionPermissionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionPermissionManager.h; sourceTree = "<group>"; };
 		93D6B7B725534A110058DD3A /* WKSpeechRecognitionPermissionCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSpeechRecognitionPermissionCallback.h; sourceTree = "<group>"; };
 		93D6B7B825534A120058DD3A /* WKSpeechRecognitionPermissionCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKSpeechRecognitionPermissionCallback.cpp; sourceTree = "<group>"; };
+		93E05E3E282CD55D000B69EB /* ProcessStateMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProcessStateMonitor.h; path = ios/ProcessStateMonitor.h; sourceTree = "<group>"; };
+		93E05E3F282CD55F000B69EB /* ProcessStateMonitor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ProcessStateMonitor.mm; path = ios/ProcessStateMonitor.mm; sourceTree = "<group>"; };
 		93E6A4ED1BC5DD3900F8A0E7 /* _WKHitTestResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKHitTestResult.h; sourceTree = "<group>"; };
 		93E7997E2756F6700074008A /* WebFileSystemStorageConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebFileSystemStorageConnection.messages.in; sourceTree = "<group>"; };
 		93E799812756FA530074008A /* WebFileSystemStorageConnectionMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebFileSystemStorageConnectionMessages.h; sourceTree = "<group>"; };
@@ -9259,6 +9262,8 @@
 				0FCB4E3618BBE044000FCFC9 /* PageClientImplIOS.h */,
 				0FCB4E3718BBE044000FCFC9 /* PageClientImplIOS.mm */,
 				86F9536218FF550B001DB2EF /* ProcessAssertionIOS.mm */,
+				93E05E3E282CD55D000B69EB /* ProcessStateMonitor.h */,
+				93E05E3F282CD55F000B69EB /* ProcessStateMonitor.mm */,
 				2DAF06D418BD1A470081CEB1 /* SmartMagnificationController.h */,
 				2DAF06D818BD23BA0081CEB1 /* SmartMagnificationController.messages.in */,
 				2DAF06D518BD1A470081CEB1 /* SmartMagnificationController.mm */,
@@ -14559,6 +14564,7 @@
 				5CB9310926E8439A0032B1C0 /* PrivateClickMeasurementXPCUtilities.h in Headers */,
 				86F9536518FF58F5001DB2EF /* ProcessAssertion.h in Headers */,
 				BC1A7C581136E19C00FB7167 /* ProcessLauncher.h in Headers */,
+				93E05E40282CD560000B69EB /* ProcessStateMonitor.h in Headers */,
 				463FD4821EB94EC000A2982C /* ProcessTerminationReason.h in Headers */,
 				86E67A251910B9D100004AB7 /* ProcessThrottler.h in Headers */,
 				83048AE61ACA45DC0082C832 /* ProcessThrottlerClient.h in Headers */,
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to