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