[webkit-changes] [WebKit/WebKit] 861148: NetworkProcess does not always terminate properly ...
bnham
noreply at github.com
Fri Jan 17 11:03:29 PST 2025
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 861148b958c311059840a4b04d00750d461d32e6
https://github.com/WebKit/WebKit/commit/861148b958c311059840a4b04d00750d461d32e6
Author: Ben Nham <nham at apple.com>
Date: 2025-01-17 (Fri, 17 Jan 2025)
Changed paths:
M Source/WebKit/SourcesCocoa.txt
M Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
M Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h
M Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp
M Source/WebKit/UIProcess/AuxiliaryProcessProxy.h
M Source/WebKit/UIProcess/Cocoa/AuxiliaryProcessProxyCocoa.mm
M Source/WebKit/UIProcess/Cocoa/ProcessAssertionCocoa.mm
R Source/WebKit/UIProcess/Cocoa/XPCConnectionTerminationWatchdog.h
R Source/WebKit/UIProcess/Cocoa/XPCConnectionTerminationWatchdog.mm
M Source/WebKit/UIProcess/ProcessAssertion.cpp
M Source/WebKit/UIProcess/ProcessAssertion.h
M Source/WebKit/UIProcess/mac/WKTextAnimationManager.mm
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm
M Tools/TestWebKitAPI/Utilities.h
Log Message:
-----------
NetworkProcess does not always terminate properly on macOS
https://bugs.webkit.org/show_bug.cgi?id=285947
rdar://142838090
Reviewed by Per Arne Vollan.
NetworkProcess does not always terminate on macOS. The reason for this is that NetworkProcess can
suspend in the middle of termination:
1. The NetworkProcessProxy destructor drops "m_backgroundActivityToPreventSuspension", which allows
NetworkProcess to suspend.
2. Then the AuxiliaryProcessProxy destructor runs and starts termination by invalidating via
IPC::Connection::invalidate.
3. The remote side of the connection invalidation in NetworkProcess (NetworkProcess::didClose) might
never run if the process is already suspended, which then leaves the process in a permanently
suspended state.
To fix this, as part of AuxiliaryProcessProxy destruction, we now start a watchdog timer which
allows the process to keep running while termination is active, and we kill the process when the
timer expires. This used to be part of XPCConnectionTerminationWatchdog, but I removed that class
since it wasn't really doing much anymore after this refactoring.
The main refactoring was making it so that process assertions can be created without an
AuxiliaryProcessProxy object. The reason for this I did not want to pass an AuxiliaryProcessProxy
object that is in the middle of its destructor to another function.
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(-[WKWebsiteDataStore _forceNetworkProcessToTaskSuspendForTesting]):
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
* Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp:
(WebKit::AuxiliaryProcessProxy::~AuxiliaryProcessProxy):
* Source/WebKit/UIProcess/AuxiliaryProcessProxy.h:
* Source/WebKit/UIProcess/Cocoa/AuxiliaryProcessProxyCocoa.mm:
(WebKit::AuxiliaryProcessProxy::platformStartConnectionTerminationWatchdog):
* Source/WebKit/UIProcess/Cocoa/ProcessAssertionCocoa.mm:
(WebKit::ProcessAssertion::ProcessAssertion):
(WebKit::ProcessAndUIAssertion::ProcessAndUIAssertion):
* Source/WebKit/UIProcess/Cocoa/XPCConnectionTerminationWatchdog.h: Removed.
* Source/WebKit/UIProcess/Cocoa/XPCConnectionTerminationWatchdog.mm: Removed.
* Source/WebKit/UIProcess/ProcessAssertion.cpp:
(WebKit::ProcessAssertion::acquireAssertion):
(WebKit::ProcessAssertion::create):
(WebKit::ProcessAndUIAssertion::create):
(WebKit::ProcessAssertion::ProcessAssertion):
(WebKit::ProcessAndUIAssertion::ProcessAndUIAssertion):
(WebKit::ProcessAssertion::aquireAssertion): Deleted.
* Source/WebKit/UIProcess/ProcessAssertion.h:
* Source/WebKit/UIProcess/mac/WKTextAnimationManager.mm:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm:
(isTaskSuspended):
(TEST(NetworkProcess, TerminateWhenNetworkProcessIsSuspended)):
* Tools/TestWebKitAPI/Utilities.h:
(TestWebKitAPI::Util::waitFor):
Canonical link: https://commits.webkit.org/289075@main
To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications
More information about the webkit-changes
mailing list