[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