Title: [252712] trunk/Source/WebKit
Revision
252712
Author
[email protected]
Date
2019-11-20 15:01:40 -0800 (Wed, 20 Nov 2019)

Log Message

[iOS] Make sure WebContent process does not get suspended while it is holding a process assertion for the UIProcess
https://bugs.webkit.org/show_bug.cgi?id=204418

Reviewed by Jer Noble.

Make sure WebContent process does not get suspended while it is holding a process assertion for the UIProcess. We
see this happening in sysdiagnoses, and it means the system ends up killing the WebContent process because it leaked
a process assertion.

* WebProcess/WebProcess.h:
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::processTaskStateDidChange):
(WebKit::WebProcess::releaseProcessWasResumedAssertions):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (252711 => 252712)


--- trunk/Source/WebKit/ChangeLog	2019-11-20 22:45:25 UTC (rev 252711)
+++ trunk/Source/WebKit/ChangeLog	2019-11-20 23:01:40 UTC (rev 252712)
@@ -1,3 +1,19 @@
+2019-11-20  Chris Dumez  <[email protected]>
+
+        [iOS] Make sure WebContent process does not get suspended while it is holding a process assertion for the UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=204418
+
+        Reviewed by Jer Noble.
+
+        Make sure WebContent process does not get suspended while it is holding a process assertion for the UIProcess. We
+        see this happening in sysdiagnoses, and it means the system ends up killing the WebContent process because it leaked
+        a process assertion.
+
+        * WebProcess/WebProcess.h:
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::processTaskStateDidChange):
+        (WebKit::WebProcess::releaseProcessWasResumedAssertions):
+
 2019-11-19  Brian Burg  <[email protected]>
 
         [Cocoa] Add _WKRemoteWebInspectorViewController SPI to set diagnostic logging delegate

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (252711 => 252712)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2019-11-20 22:45:25 UTC (rev 252711)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2019-11-20 23:01:40 UTC (rev 252712)
@@ -464,6 +464,8 @@
     void processTaskStateDidChange(ProcessTaskStateObserver::TaskState) final;
     bool shouldFreezeOnSuspension() const;
     void updateFreezerStatus();
+
+    void releaseProcessWasResumedAssertions();
 #endif
 
 #if ENABLE(VIDEO)
@@ -542,8 +544,9 @@
 #if PLATFORM(IOS_FAMILY)
     WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
     RefPtr<ProcessTaskStateObserver> m_taskStateObserver;
-    Lock m_processWasResumedUIAssertionLock;
+    Lock m_processWasResumedAssertionsLock;
     RetainPtr<BKSProcessAssertion> m_processWasResumedUIAssertion;
+    RetainPtr<BKSProcessAssertion> m_processWasResumedOwnAssertion;
 #endif
 
     enum PageMarkingLayersAsVolatileCounterType { };

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (252711 => 252712)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2019-11-20 22:45:25 UTC (rev 252711)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2019-11-20 23:01:40 UTC (rev 252712)
@@ -300,30 +300,49 @@
     if (taskState != ProcessTaskStateObserver::Running)
         return;
 
-    LockHolder holder(m_processWasResumedUIAssertionLock);
-    if (m_processWasResumedUIAssertion)
+    LockHolder holder(m_processWasResumedAssertionsLock);
+    if (m_processWasResumedUIAssertion && m_processWasResumedOwnAssertion)
         return;
 
     // We were awakened from suspension unexpectedly. Notify the WebProcessProxy, but take a process assertion on our parent PID
     // to ensure that it too is awakened.
     RELEASE_LOG(ProcessSuspension, "%p - WebProcess::processTaskStateChanged() Taking 'WebProcess was resumed' assertion on behalf on UIProcess", this);
-    m_processWasResumedUIAssertion = adoptNS([[BKSProcessAssertion alloc] initWithPID:parentProcessConnection()->remoteProcessID() flags:BKSProcessAssertionPreventTaskSuspend reason:BKSProcessAssertionReasonFinishTask name:@"WebProcess was resumed" withHandler:nil]);
-
+    m_processWasResumedUIAssertion = adoptNS([[BKSProcessAssertion alloc] initWithPID:parentProcessConnection()->remoteProcessID() flags:BKSProcessAssertionPreventTaskSuspend reason:BKSProcessAssertionReasonFinishTask name:@"WebProcess was resumed" withHandler:^(BOOL acquired) {
+        if (!acquired)
+            RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::processTaskStateDidChange() failed to take 'WebProcess was resumed' assertion for parent process", this);
+    }]);
     m_processWasResumedUIAssertion.get().invalidationHandler = [this] {
-        LockHolder holder(m_processWasResumedUIAssertionLock);
-        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::processTaskStateChanged() Releasing 'WebProcess was resumed' assertion on behalf on UIProcess due invalidation", this);
-        [m_processWasResumedUIAssertion invalidate];
-        m_processWasResumedUIAssertion = nullptr;
+        RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::processTaskStateChanged() Releasing 'WebProcess was resumed' assertion on behalf on UIProcess due to invalidation", this);
+        releaseProcessWasResumedAssertions();
     };
+    m_processWasResumedOwnAssertion = adoptNS([[BKSProcessAssertion alloc] initWithPID:getpid() flags:BKSProcessAssertionPreventTaskSuspend reason:BKSProcessAssertionReasonFinishTask name:@"WebProcess was resumed" withHandler:^(BOOL acquired) {
+        if (!acquired)
+            RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::processTaskStateDidChange() failed to take 'WebProcess was resumed' assertion for WebContent process", this);
+    }]);
+    m_processWasResumedOwnAssertion.get().invalidationHandler = [this] {
+        RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::processTaskStateChanged() Releasing 'WebProcess was resumed' assertion on behalf on WebContent process due to invalidation", this);
+        releaseProcessWasResumedAssertions();
+    };
 
-    // This will cause the parent process to send a ParentProcessDidHandleProcessWasResumed IPC back, so that we can release our assertion on its behalf.
     parentProcessConnection()->sendWithAsyncReply(Messages::WebProcessProxy::ProcessWasResumed(), [this] {
-        LockHolder holder(m_processWasResumedUIAssertionLock);
-        ASSERT(m_processWasResumedUIAssertion);
-        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::parentProcessDidHandleProcessWasResumed() Releasing 'WebProcess was resumed' assertion on behalf on UIProcess", this);
+        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::processTaskStateDidChange() Parent process handled ProcessWasResumed IPC, releasing our assertions", this);
+        releaseProcessWasResumedAssertions();
+    });
+}
+
+void WebProcess::releaseProcessWasResumedAssertions()
+{
+    LockHolder holder(m_processWasResumedAssertionsLock);
+    if (m_processWasResumedUIAssertion) {
+        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::releaseProcessWasResumedAssertions() Releasing parent process 'WebProcess was resumed' assertion", this);
         [m_processWasResumedUIAssertion invalidate];
         m_processWasResumedUIAssertion = nullptr;
-    });
+    }
+    if (m_processWasResumedOwnAssertion) {
+        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::releaseProcessWasResumedAssertions() Releasing WebContent process 'WebProcess was resumed' assertion", this);
+        [m_processWasResumedOwnAssertion invalidate];
+        m_processWasResumedOwnAssertion = nullptr;
+    }
 }
 
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to