Title: [293829] trunk/Source/WebKit
Revision
293829
Author
[email protected]
Date
2022-05-05 06:42:39 -0700 (Thu, 05 May 2022)

Log Message

Connecting to GPU process may hang if UI process sends sync message simultaneously
https://bugs.webkit.org/show_bug.cgi?id=239905

Patch by Kimmo Kinnunen <[email protected]> on 2022-05-05
Reviewed by Chris Dumez.

Previously, establishing GPU process connection would be a sync message:
 1. WP -> UI sync GetGPUProcessConnection
 2. UI -> GPUP async CreateGPUConnectionToWebProcess
 3. GPUP -> UI async reply CreateGPUConnectionToWebProcess
 4. UI -> WP sync reply GetGPUProcessConnection

If UI would send a message to WP after step 3 and wait for reply, this
would never come as WP would be waiting for the sync reply for GetGPUProcessConnection.

This would happen for example with requestAutocorrectionContextWithCompletionHandler,
which would send HandleAutocorrectionContextRequest and wait for
Messages::WebPageProxy::HandleAutocorrectionContext messages.

Mitigate this by creating the GPU connection in WP and sending
that to GPUP through UI in an async message. This way WP does not block on the GPUP
connection initialization. Send the GPUP connection initialization result, audit token and
vp9 HW decoder presence, as the first user message through the new connection.

* GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::create):
(WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
* GPUProcess/GPUConnectionToWebProcess.h:
* GPUProcess/GPUProcess.cpp:
(WebKit::asConnectionIdentifier):
(WebKit::GPUProcess::createGPUConnectionToWebProcess):
* GPUProcess/GPUProcess.h:
* GPUProcess/GPUProcess.messages.in:
* Shared/GPUProcessConnectionInitializationParameters.h:
(WebKit::GPUProcessConnectionInitializationParameters::decode):
* Shared/GPUProcessConnectionParameters.h:
(WebKit::GPUProcessConnectionParameters::encode const):
(WebKit::GPUProcessConnectionParameters::decode):
* UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::createGPUProcessConnection):
* UIProcess/GPU/GPUProcessProxy.h:
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::createGPUProcessConnection):
* UIProcess/WebProcessPool.h:
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::createGPUProcessConnection):
* UIProcess/WebProcessProxy.h:
* UIProcess/WebProcessProxy.messages.in:
* WebProcess/GPU/GPUProcessConnection.cpp:
(WebKit::getGPUProcessConnectionParameters):
(WebKit::GPUProcessConnection::create):
(WebKit::GPUProcessConnection::GPUProcessConnection):
(WebKit::GPUProcessConnection::auditToken):
(WebKit::GPUProcessConnection::invalidate):
(WebKit::GPUProcessConnection::didInitialize):
(WebKit::GPUProcessConnection::waitForDidInitialize):
(WebKit::GPUProcessConnection::hasVP9HardwareDecoder):
* WebProcess/GPU/GPUProcessConnection.h:
* WebProcess/GPU/GPUProcessConnection.messages.in:
* WebProcess/GPU/GPUProcessConnectionInfo.h:
(WebKit::GPUProcessConnectionInfo::encode const):
(WebKit::GPUProcessConnectionInfo::decode):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::ensureGPUProcessConnection):
* WebProcess/WebProcess.h:
* WebProcess/cocoa/WebProcessCocoa.mm:

Modified Paths

Removed Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (293828 => 293829)


--- trunk/Source/WebKit/ChangeLog	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/ChangeLog	2022-05-05 13:42:39 UTC (rev 293829)
@@ -1,3 +1,71 @@
+2022-05-05  Kimmo Kinnunen  <[email protected]>
+
+        Connecting to GPU process may hang if UI process sends sync message simultaneously
+        https://bugs.webkit.org/show_bug.cgi?id=239905
+
+        Reviewed by Chris Dumez.
+
+        Previously, establishing GPU process connection would be a sync message:
+         1. WP -> UI sync GetGPUProcessConnection
+         2. UI -> GPUP async CreateGPUConnectionToWebProcess
+         3. GPUP -> UI async reply CreateGPUConnectionToWebProcess
+         4. UI -> WP sync reply GetGPUProcessConnection
+
+        If UI would send a message to WP after step 3 and wait for reply, this
+        would never come as WP would be waiting for the sync reply for GetGPUProcessConnection.
+
+        This would happen for example with requestAutocorrectionContextWithCompletionHandler,
+        which would send HandleAutocorrectionContextRequest and wait for
+        Messages::WebPageProxy::HandleAutocorrectionContext messages.
+
+        Mitigate this by creating the GPU connection in WP and sending
+        that to GPUP through UI in an async message. This way WP does not block on the GPUP
+        connection initialization. Send the GPUP connection initialization result, audit token and
+        vp9 HW decoder presence, as the first user message through the new connection.
+
+        * GPUProcess/GPUConnectionToWebProcess.cpp:
+        (WebKit::GPUConnectionToWebProcess::create):
+        (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
+        * GPUProcess/GPUConnectionToWebProcess.h:
+        * GPUProcess/GPUProcess.cpp:
+        (WebKit::asConnectionIdentifier):
+        (WebKit::GPUProcess::createGPUConnectionToWebProcess):
+        * GPUProcess/GPUProcess.h:
+        * GPUProcess/GPUProcess.messages.in:
+        * Shared/GPUProcessConnectionInitializationParameters.h:
+        (WebKit::GPUProcessConnectionInitializationParameters::decode):
+        * Shared/GPUProcessConnectionParameters.h:
+        (WebKit::GPUProcessConnectionParameters::encode const):
+        (WebKit::GPUProcessConnectionParameters::decode):
+        * UIProcess/GPU/GPUProcessProxy.cpp:
+        (WebKit::GPUProcessProxy::createGPUProcessConnection):
+        * UIProcess/GPU/GPUProcessProxy.h:
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::createGPUProcessConnection):
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::createGPUProcessConnection):
+        * UIProcess/WebProcessProxy.h:
+        * UIProcess/WebProcessProxy.messages.in:
+        * WebProcess/GPU/GPUProcessConnection.cpp:
+        (WebKit::getGPUProcessConnectionParameters):
+        (WebKit::GPUProcessConnection::create):
+        (WebKit::GPUProcessConnection::GPUProcessConnection):
+        (WebKit::GPUProcessConnection::auditToken):
+        (WebKit::GPUProcessConnection::invalidate):
+        (WebKit::GPUProcessConnection::didInitialize):
+        (WebKit::GPUProcessConnection::waitForDidInitialize):
+        (WebKit::GPUProcessConnection::hasVP9HardwareDecoder):
+        * WebProcess/GPU/GPUProcessConnection.h:
+        * WebProcess/GPU/GPUProcessConnection.messages.in:
+        * WebProcess/GPU/GPUProcessConnectionInfo.h:
+        (WebKit::GPUProcessConnectionInfo::encode const):
+        (WebKit::GPUProcessConnectionInfo::decode):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::ensureGPUProcessConnection):
+        * WebProcess/WebProcess.h:
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+
 2022-05-05  Youenn Fablet  <[email protected]>
 
         SWOriginStore is no longer needed

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (293828 => 293829)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -31,6 +31,7 @@
 #include "DataReference.h"
 #include "GPUConnectionToWebProcessMessages.h"
 #include "GPUProcess.h"
+#include "GPUProcessConnectionInfo.h"
 #include "GPUProcessConnectionMessages.h"
 #include "GPUProcessConnectionParameters.h"
 #include "GPUProcessMessages.h"
@@ -232,13 +233,13 @@
 
 #endif
 
-Ref<GPUConnectionToWebProcess> GPUConnectionToWebProcess::create(GPUProcess& gpuProcess, WebCore::ProcessIdentifier webProcessIdentifier, IPC::Connection::Identifier connectionIdentifier, PAL::SessionID sessionID, GPUProcessConnectionParameters&& parameters)
+Ref<GPUConnectionToWebProcess> GPUConnectionToWebProcess::create(GPUProcess& gpuProcess, WebCore::ProcessIdentifier webProcessIdentifier, PAL::SessionID sessionID, IPC::Connection::Identifier&& connectionIdentifier, GPUProcessConnectionParameters&& parameters)
 {
-    return adoptRef(*new GPUConnectionToWebProcess(gpuProcess, webProcessIdentifier, connectionIdentifier, sessionID, WTFMove(parameters)));
+    return adoptRef(*new GPUConnectionToWebProcess(gpuProcess, webProcessIdentifier, sessionID, WTFMove(connectionIdentifier), WTFMove(parameters)));
 }
 
-GPUConnectionToWebProcess::GPUConnectionToWebProcess(GPUProcess& gpuProcess, WebCore::ProcessIdentifier webProcessIdentifier, IPC::Connection::Identifier connectionIdentifier, PAL::SessionID sessionID, GPUProcessConnectionParameters&& parameters)
-    : m_connection(IPC::Connection::createServerConnection(connectionIdentifier, *this))
+GPUConnectionToWebProcess::GPUConnectionToWebProcess(GPUProcess& gpuProcess, WebCore::ProcessIdentifier webProcessIdentifier, PAL::SessionID sessionID, IPC::Connection::Identifier&& connectionIdentifier, GPUProcessConnectionParameters&& parameters)
+    : m_connection(IPC::Connection::createClientConnection(connectionIdentifier, *this))
     , m_gpuProcess(gpuProcess)
     , m_webProcessIdentifier(webProcessIdentifier)
     , m_webProcessIdentity(WTFMove(parameters.webProcessIdentity))
@@ -278,7 +279,15 @@
     // reply from the GPU process, which would be unsafe.
     m_connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true);
     m_connection->open();
-
+    WebKit::GPUProcessConnectionInfo info {
+#if HAVE(AUDIT_TOKEN)
+        gpuProcess.parentProcessConnection()->getAuditToken(),
+#endif
+#if ENABLE(VP9)
+        WebCore::vp9HardwareDecoderAvailable()
+#endif
+    };
+    m_connection->send(Messages::GPUProcessConnection::DidInitialize(info), 0);
     ++gObjectCountForTesting;
 }
 

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (293828 => 293829)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -120,7 +120,7 @@
     , public WebCore::NowPlayingManager::Client
     , IPC::Connection::Client {
 public:
-    static Ref<GPUConnectionToWebProcess> create(GPUProcess&, WebCore::ProcessIdentifier, IPC::Connection::Identifier, PAL::SessionID, GPUProcessConnectionParameters&&);
+    static Ref<GPUConnectionToWebProcess> create(GPUProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier&&, GPUProcessConnectionParameters&&);
     virtual ~GPUConnectionToWebProcess();
 
     using WebCore::NowPlayingManager::Client::weakPtrFactory;
@@ -213,7 +213,7 @@
 #endif
 
 private:
-    GPUConnectionToWebProcess(GPUProcess&, WebCore::ProcessIdentifier, IPC::Connection::Identifier, PAL::SessionID, GPUProcessConnectionParameters&&);
+    GPUConnectionToWebProcess(GPUProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier&&, GPUProcessConnectionParameters&&);
 
 #if ENABLE(WEB_AUDIO)
     RemoteAudioDestinationManager& remoteAudioDestinationManager();

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (293828 => 293829)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -33,7 +33,6 @@
 #include "AuxiliaryProcessMessages.h"
 #include "DataReference.h"
 #include "GPUConnectionToWebProcess.h"
-#include "GPUProcessConnectionInitializationParameters.h"
 #include "GPUProcessConnectionParameters.h"
 #include "GPUProcessCreationParameters.h"
 #include "GPUProcessProxyMessages.h"
@@ -116,16 +115,25 @@
     didReceiveGPUProcessMessage(connection, decoder);
 }
 
-void GPUProcess::createGPUConnectionToWebProcess(WebCore::ProcessIdentifier identifier, PAL::SessionID sessionID, GPUProcessConnectionParameters&& parameters, CompletionHandler<void(std::optional<IPC::Attachment>&&, GPUProcessConnectionInitializationParameters&&)>&& completionHandler)
+static IPC::Connection::Identifier asConnectionIdentifier(IPC::Attachment&& connectionHandle)
 {
+#if USE(UNIX_DOMAIN_SOCKETS)
+    return IPC::Connection::Identifier { connectionHandle.release().release() };
+#elif OS(DARWIN)
+    return IPC::Connection::Identifier { connectionHandle.port() };
+#elif OS(WINDOWS)
+    return IPC::Connection::Identifier { connectionHandle.handle() };
+#else
+    notImplemented();
+    return IPC::Connection::Identifier { };
+#endif
+}
+
+void GPUProcess::createGPUConnectionToWebProcess(WebCore::ProcessIdentifier identifier, PAL::SessionID sessionID, IPC::Attachment&& connectionIdentifier, GPUProcessConnectionParameters&& parameters, CompletionHandler<void()>&& completionHandler)
+{
     RELEASE_LOG(Process, "%p - GPUProcess::createGPUConnectionToWebProcess: processIdentifier=%" PRIu64, this, identifier.toUInt64());
-    auto connectionIdentifiers = IPC::Connection::createConnectionIdentifierPair();
-    if (!connectionIdentifiers) {
-        completionHandler({ }, { });
-        return;
-    }
 
-    auto newConnection = GPUConnectionToWebProcess::create(*this, identifier, connectionIdentifiers->server, sessionID, WTFMove(parameters));
+    auto newConnection = GPUConnectionToWebProcess::create(*this, identifier, sessionID, asConnectionIdentifier(WTFMove(connectionIdentifier)), WTFMove(parameters));
 
 #if ENABLE(MEDIA_STREAM)
     // FIXME: We should refactor code to go from WebProcess -> GPUProcess -> UIProcess when getUserMedia is called instead of going from WebProcess -> UIProcess directly.
@@ -142,11 +150,8 @@
     ASSERT(!m_webProcessConnections.contains(identifier));
     m_webProcessConnections.add(identifier, WTFMove(newConnection));
 
-    GPUProcessConnectionInitializationParameters connectionParameters;
-#if ENABLE(VP9)
-    connectionParameters.hasVP9HardwareDecoder = WebCore::vp9HardwareDecoderAvailable();
-#endif
-    completionHandler(WTFMove(connectionIdentifiers->client), WTFMove(connectionParameters));
+
+    completionHandler();
 }
 
 void GPUProcess::removeGPUConnectionToWebProcess(GPUConnectionToWebProcess& connection)

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (293828 => 293829)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -59,7 +59,6 @@
 namespace WebKit {
 
 class GPUConnectionToWebProcess;
-struct GPUProcessConnectionInitializationParameters;
 struct GPUProcessConnectionParameters;
 struct GPUProcessCreationParameters;
 struct GPUProcessSessionParameters;
@@ -139,7 +138,7 @@
 
     // Message Handlers
     void initializeGPUProcess(GPUProcessCreationParameters&&);
-    void createGPUConnectionToWebProcess(WebCore::ProcessIdentifier, PAL::SessionID, GPUProcessConnectionParameters&&, CompletionHandler<void(std::optional<IPC::Attachment>&&, GPUProcessConnectionInitializationParameters&&)>&&);
+    void createGPUConnectionToWebProcess(WebCore::ProcessIdentifier, PAL::SessionID, IPC::Attachment&&, GPUProcessConnectionParameters&&, CompletionHandler<void()>&&);
     void addSession(PAL::SessionID, GPUProcessSessionParameters&&);
     void removeSession(PAL::SessionID);
 

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in (293828 => 293829)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2022-05-05 13:42:39 UTC (rev 293829)
@@ -25,7 +25,7 @@
 messages -> GPUProcess LegacyReceiver {
     InitializeGPUProcess(struct WebKit::GPUProcessCreationParameters processCreationParameters)
 
-    CreateGPUConnectionToWebProcess(WebCore::ProcessIdentifier processIdentifier, PAL::SessionID sessionID, struct WebKit::GPUProcessConnectionParameters parameters) -> (std::optional<IPC::Attachment> connectionIdentifier, struct WebKit::GPUProcessConnectionInitializationParameters parameters)
+    CreateGPUConnectionToWebProcess(WebCore::ProcessIdentifier processIdentifier, PAL::SessionID sessionID, IPC::Attachment connectionIdentifier, struct WebKit::GPUProcessConnectionParameters parameters) -> ()
 
     PrepareToSuspend(bool isSuspensionImminent) -> ()
     ProcessDidResume()

Deleted: trunk/Source/WebKit/Shared/GPUProcessConnectionInitializationParameters.h (293828 => 293829)


--- trunk/Source/WebKit/Shared/GPUProcessConnectionInitializationParameters.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/Shared/GPUProcessConnectionInitializationParameters.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 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 ENABLE(GPU_PROCESS)
-
-#include <wtf/MachSendRight.h>
-
-namespace WebKit {
-
-struct GPUProcessConnectionInitializationParameters {
-#if ENABLE(VP9)
-    bool hasVP9HardwareDecoder { false };
-#endif
-
-    void encode(IPC::Encoder& encoder) const
-    {
-#if ENABLE(VP9)
-        encoder << hasVP9HardwareDecoder;
-#endif
-    }
-
-    static std::optional<GPUProcessConnectionInitializationParameters> decode(IPC::Decoder& decoder)
-    {
-#if ENABLE(VP9)
-        std::optional<bool> hasVP9HardwareDecoder;
-        decoder >> hasVP9HardwareDecoder;
-        if (!hasVP9HardwareDecoder)
-            return std::nullopt;
-#endif
-
-        return GPUProcessConnectionInitializationParameters {
-#if ENABLE(VP9)
-            WTFMove(*hasVP9HardwareDecoder)
-#endif
-        };
-    }
-};
-
-} // namespace WebKit
-
-#endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/Shared/GPUProcessConnectionParameters.h (293828 => 293829)


--- trunk/Source/WebKit/Shared/GPUProcessConnectionParameters.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/Shared/GPUProcessConnectionParameters.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -59,33 +59,17 @@
 
     static std::optional<GPUProcessConnectionParameters> decode(IPC::Decoder& decoder)
     {
-        std::optional<WebCore::ProcessIdentity> webProcessIdentity;
-        decoder >> webProcessIdentity;
-        if (!webProcessIdentity)
-            return std::nullopt;
-
-        std::optional<Vector<String>> overrideLanguages;
-        decoder >> overrideLanguages;
-        if (!overrideLanguages)
-            return std::nullopt;
-
-        std::optional<bool> isCaptivePortalModeEnabled;
-        decoder >> isCaptivePortalModeEnabled;
-        if (!isCaptivePortalModeEnabled)
-            return std::nullopt;
-
+        auto webProcessIdentity = decoder.decode<WebCore::ProcessIdentity>();
+        auto overrideLanguages = decoder.decode<Vector<String>>();
+        auto isCaptivePortalModeEnabled = decoder.decode<bool>();
 #if ENABLE(IPC_TESTING_API)
-        std::optional<bool> ignoreInvalidMessageForTesting;
-        decoder >> ignoreInvalidMessageForTesting;
-        if (!ignoreInvalidMessageForTesting)
-            return std::nullopt;
+        auto ignoreInvalidMessageForTesting = decoder.decode<bool>();
 #endif
-
 #if HAVE(AUDIT_TOKEN)
-        std::optional<audit_token_t> presentingApplicationAuditToken;
-        if (!decoder.decode(presentingApplicationAuditToken))
+        auto presentingApplicationAuditToken = decoder.decode<std::optional<audit_token_t>>();
+#endif
+        if (!decoder.isValid())
             return std::nullopt;
-#endif
 
         return GPUProcessConnectionParameters {
             WTFMove(*webProcessIdentity),
@@ -95,7 +79,7 @@
             *ignoreInvalidMessageForTesting,
 #endif
 #if HAVE(AUDIT_TOKEN)
-            WTFMove(presentingApplicationAuditToken),
+            WTFMove(*presentingApplicationAuditToken),
 #endif
         };
     }

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -29,7 +29,6 @@
 #if ENABLE(GPU_PROCESS)
 
 #include "DrawingAreaProxy.h"
-#include "GPUProcessConnectionInfo.h"
 #include "GPUProcessConnectionParameters.h"
 #include "GPUProcessCreationParameters.h"
 #include "GPUProcessMessages.h"
@@ -369,33 +368,15 @@
         singleton() = nullptr;
 }
 
-void GPUProcessProxy::getGPUProcessConnection(WebProcessProxy& webProcessProxy, const GPUProcessConnectionParameters& parameters, Messages::WebProcessProxy::GetGPUProcessConnection::DelayedReply&& reply)
+void GPUProcessProxy::createGPUProcessConnection(WebProcessProxy& webProcessProxy, IPC::Attachment&& connectionIdentifier, GPUProcessConnectionParameters&& parameters)
 {
     addSession(webProcessProxy.websiteDataStore());
-
     RELEASE_LOG(ProcessSuspension, "%p - GPUProcessProxy is taking a background assertion because a web process is requesting a connection", this);
     startResponsivenessTimer(UseLazyStop::No);
-    sendWithAsyncReply(Messages::GPUProcess::CreateGPUConnectionToWebProcess { webProcessProxy.coreProcessIdentifier(), webProcessProxy.sessionID(), parameters }, [this, weakThis = WeakPtr { *this }, reply = WTFMove(reply)](auto&& identifier, auto&& connectionParameters) mutable {
-        if (!weakThis) {
-            RELEASE_LOG_ERROR(Process, "GPUProcessProxy::getGPUProcessConnection: GPUProcessProxy deallocated during connection establishment");
-            return reply({ });
-        }
-
+    sendWithAsyncReply(Messages::GPUProcess::CreateGPUConnectionToWebProcess { webProcessProxy.coreProcessIdentifier(), webProcessProxy.sessionID(), connectionIdentifier, parameters }, [this, weakThis = WeakPtr { *this }]() mutable {
+        if (!weakThis)
+            return;
         stopResponsivenessTimer();
-        if (!identifier) {
-            RELEASE_LOG_ERROR(Process, "GPUProcessProxy::getGPUProcessConnection: connection identifier is empty");
-            return reply({ });
-        }
-
-#if USE(UNIX_DOMAIN_SOCKETS) || OS(WINDOWS)
-        reply(GPUProcessConnectionInfo { WTFMove(*identifier) });
-        UNUSED_VARIABLE(this);
-#elif OS(DARWIN)
-        MESSAGE_CHECK(MACH_PORT_VALID(identifier->port()));
-        reply(GPUProcessConnectionInfo { IPC::Attachment { identifier->port(), MACH_MSG_TYPE_MOVE_SEND }, this->connection()->getAuditToken(), WTFMove(connectionParameters) });
-#else
-        notImplemented();
-#endif
     }, 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
 }
 

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -72,7 +72,7 @@
     static GPUProcessProxy* singletonIfCreated();
     ~GPUProcessProxy();
 
-    void getGPUProcessConnection(WebProcessProxy&, const GPUProcessConnectionParameters&, Messages::WebProcessProxy::GetGPUProcessConnectionDelayedReply&&);
+    void createGPUProcessConnection(WebProcessProxy&, IPC::Attachment&& connectionIdentifier, GPUProcessConnectionParameters&&);
 
     ProcessThrottler& throttler() final { return m_throttler; }
     void updateProcessAssertion();

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -40,7 +40,6 @@
 #include "AuxiliaryProcessProxy.h"
 #include "DownloadProxy.h"
 #include "DownloadProxyMessages.h"
-#include "GPUProcessConnectionInfo.h"
 #include "GPUProcessConnectionParameters.h"
 #include "GamepadData.h"
 #include "HighPerformanceGraphicsUsageSampler.h"
@@ -514,7 +513,7 @@
     }
 }
 
-void WebProcessPool::getGPUProcessConnection(WebProcessProxy& webProcessProxy, GPUProcessConnectionParameters&& parameters, Messages::WebProcessProxy::GetGPUProcessConnection::DelayedReply&& reply)
+void WebProcessPool::createGPUProcessConnection(WebProcessProxy& webProcessProxy, IPC::Attachment&& connectionIdentifier, WebKit::GPUProcessConnectionParameters&& parameters)
 {
 #if ENABLE(IPC_TESTING_API)
     parameters.ignoreInvalidMessageForTesting = webProcessProxy.ignoreInvalidMessageForTesting();
@@ -525,21 +524,7 @@
 #endif
 
     parameters.isCaptivePortalModeEnabled = webProcessProxy.captivePortalMode() == WebProcessProxy::CaptivePortalMode::Enabled;
-
-    ensureGPUProcess().getGPUProcessConnection(webProcessProxy, parameters, [this, weakThis = WeakPtr { *this }, parameters, webProcessProxy = WeakPtr { webProcessProxy }, reply = WTFMove(reply)] (auto& connectionInfo) mutable {
-        if (UNLIKELY(!IPC::Connection::identifierIsValid(connectionInfo.identifier()))) {
-            // Retry on the next RunLoop iteration because we may be inside the WebProcessPool destructor.
-            RunLoop::main().dispatch([this, weakThis = WTFMove(weakThis), webProcessProxy = WTFMove(webProcessProxy), parameters = WTFMove(parameters), reply = WTFMove(reply)] () mutable {
-                if (weakThis && webProcessProxy) {
-                    WEBPROCESSPOOL_RELEASE_LOG_ERROR(Process, "getGPUProcessConnection: Failed first attempt, retrying");
-                    ensureGPUProcess().getGPUProcessConnection(*webProcessProxy, parameters, WTFMove(reply));
-                } else
-                    reply({ });
-            });
-            return;
-        }
-        reply(connectionInfo);
-    });
+    ensureGPUProcess().createGPUProcessConnection(webProcessProxy, WTFMove(connectionIdentifier), WTFMove(parameters));
 }
 #endif
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -363,7 +363,7 @@
     void gpuProcessDidFinishLaunching(ProcessID);
     void gpuProcessExited(ProcessID, ProcessTerminationReason);
 
-    void getGPUProcessConnection(WebProcessProxy&, GPUProcessConnectionParameters&&, Messages::WebProcessProxy::GetGPUProcessConnectionDelayedReply&&);
+    void createGPUProcessConnection(WebProcessProxy&, IPC::Attachment&&, WebKit::GPUProcessConnectionParameters&&);
 
     GPUProcessProxy& ensureGPUProcess();
     GPUProcessProxy* gpuProcess() const { return m_gpuProcess.get(); }

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -819,9 +819,9 @@
 }
 
 #if ENABLE(GPU_PROCESS)
-void WebProcessProxy::getGPUProcessConnection(GPUProcessConnectionParameters&& parameters, Messages::WebProcessProxy::GetGPUProcessConnection::DelayedReply&& reply)
+void WebProcessProxy::createGPUProcessConnection(IPC::Attachment&& connectionIdentifier, WebKit::GPUProcessConnectionParameters&& parameters)
 {
-    m_processPool->getGPUProcessConnection(*this, WTFMove(parameters), WTFMove(reply));
+    m_processPool->createGPUProcessConnection(*this, WTFMove(connectionIdentifier), WTFMove(parameters));
 }
 
 void WebProcessProxy::gpuProcessDidFinishLaunching()

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -482,7 +482,7 @@
     void getNetworkProcessConnection(Messages::WebProcessProxy::GetNetworkProcessConnectionDelayedReply&&);
 
 #if ENABLE(GPU_PROCESS)
-    void getGPUProcessConnection(GPUProcessConnectionParameters&&, Messages::WebProcessProxy::GetGPUProcessConnectionDelayedReply&&);
+    void createGPUProcessConnection(IPC::Attachment&& connectionIdentifier, WebKit::GPUProcessConnectionParameters&&);
 #endif
 
 #if ENABLE(WEB_AUTHN)

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.messages.in (293828 => 293829)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.messages.in	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.messages.in	2022-05-05 13:42:39 UTC (rev 293829)
@@ -34,7 +34,7 @@
     GetNetworkProcessConnection() -> (struct WebKit::NetworkProcessConnectionInfo connectionInfo) Synchronous
 
 #if ENABLE(GPU_PROCESS)
-    GetGPUProcessConnection(struct WebKit::GPUProcessConnectionParameters parameters) -> (struct WebKit::GPUProcessConnectionInfo connectionInfo) Synchronous
+    CreateGPUProcessConnection(IPC::Attachment connectionIdentifier, struct WebKit::GPUProcessConnectionParameters parameters)
 #endif
 
 #if ENABLE(WEB_AUTHN)

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (293828 => 293829)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2022-05-05 13:42:39 UTC (rev 293829)
@@ -833,7 +833,6 @@
 		3FB08E431F60B240005E5312 /* iOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3FB08E421F60B240005E5312 /* iOS.xcassets */; };
 		3FFDDB961F577F480050E593 /* WKFullScreenWindowControllerIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F915C0F1F564DED00183CE9 /* WKFullScreenWindowControllerIOS.h */; };
 		410482CE1DDD324F00F006D0 /* RTCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 410482CC1DDD2FB500F006D0 /* RTCNetwork.h */; };
-		410F0D4C2701EFF900F96DFC /* GPUProcessConnectionInitializationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 410F0D4B2701EFEA00F96DFC /* GPUProcessConnectionInitializationParameters.h */; };
 		411A8DDB20DDD1AC0060D34F /* WKMockMediaDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 411A8DD920DDB6050060D34F /* WKMockMediaDevice.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		411B22641E371BA6004F7363 /* LibWebRTCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 411B22621E371244004F7363 /* LibWebRTCNetwork.h */; };
 		411B89C927B2B75D00F9EBD3 /* WKQueryPermissionResultCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 411B89C727B2B75C00F9EBD3 /* WKQueryPermissionResultCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -4410,7 +4409,6 @@
 		410482CC1DDD2FB500F006D0 /* RTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNetwork.h; sourceTree = "<group>"; };
 		410BA139257135F2002E2F8A /* NetworkRTCTCPSocketCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkRTCTCPSocketCocoa.mm; sourceTree = "<group>"; };
 		410BA13A257135F2002E2F8A /* NetworkRTCTCPSocketCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NetworkRTCTCPSocketCocoa.h; sourceTree = "<group>"; };
-		410F0D4B2701EFEA00F96DFC /* GPUProcessConnectionInitializationParameters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPUProcessConnectionInitializationParameters.h; sourceTree = "<group>"; };
 		4111436320F677B10026F912 /* InjectUserScriptImmediately.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectUserScriptImmediately.h; sourceTree = "<group>"; };
 		411223B72602152B00B0A0B6 /* RTCDataChannelRemoteManager.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = RTCDataChannelRemoteManager.messages.in; path = Network/webrtc/RTCDataChannelRemoteManager.messages.in; sourceTree = "<group>"; };
 		411223BB26024E8000B0A0B6 /* RTCDataChannelRemoteManagerProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RTCDataChannelRemoteManagerProxy.h; sourceTree = "<group>"; };
@@ -7934,7 +7932,6 @@
 				1A14F8DF1D74C834006CBEC6 /* FrameInfoData.cpp */,
 				1A14F8E01D74C834006CBEC6 /* FrameInfoData.h */,
 				5C121E8324101F7000486F9B /* FrameTreeNodeData.h */,
-				410F0D4B2701EFEA00F96DFC /* GPUProcessConnectionInitializationParameters.h */,
 				46AC532425DED81E003B57EC /* GPUProcessConnectionParameters.h */,
 				1AC75A1A1B3368270056745B /* HangDetectionDisabler.h */,
 				0FD2CB2526CDD7A30008B11C /* IdentifierTypes.h */,
@@ -14312,7 +14309,6 @@
 				BC06F43A12DBCCFB002D78DE /* GeolocationPermissionRequestProxy.h in Headers */,
 				F4CF1E9D25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.h in Headers */,
 				2DA944A41884E4F000ED86DB /* GestureTypes.h in Headers */,
-				410F0D4C2701EFF900F96DFC /* GPUProcessConnectionInitializationParameters.h in Headers */,
 				4614F13225DED875007006E7 /* GPUProcessConnectionParameters.h in Headers */,
 				2DA049B8180CCD0A00AAFA9E /* GraphicsLayerCARemote.h in Headers */,
 				C0CE72AD1247E78D00BC0EC4 /* HandleMessage.h in Headers */,

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -31,7 +31,9 @@
 #include "AudioMediaStreamTrackRendererInternalUnitManager.h"
 #include "DataReference.h"
 #include "GPUConnectionToWebProcessMessages.h"
-#include "GPUProcessConnectionInitializationParameters.h"
+#include "GPUProcessConnectionInfo.h"
+#include "GPUProcessConnectionMessages.h"
+#include "GPUProcessConnectionParameters.h"
 #include "LibWebRTCCodecs.h"
 #include "LibWebRTCCodecsMessages.h"
 #include "Logging.h"
@@ -53,6 +55,7 @@
 #include "WebPageCreationParameters.h"
 #include "WebPageMessages.h"
 #include "WebProcess.h"
+#include "WebProcessProxyMessages.h"
 #include <WebCore/PlatformMediaSessionManager.h>
 #include <WebCore/SharedBuffer.h>
 #include <wtf/Language.h>
@@ -106,12 +109,35 @@
     static_cast<GPUProcessConnection*>(context)->connection().send(Messages::GPUConnectionToWebProcess::SetUserPreferredLanguages(userPreferredLanguages()), { });
 }
 
-GPUProcessConnection::GPUProcessConnection(IPC::Connection::Identifier connectionIdentifier, const GPUProcessConnectionInitializationParameters& parameters)
-    : m_connection(IPC::Connection::createClientConnection(connectionIdentifier, *this))
-#if ENABLE(VP9)
-    , m_hasVP9HardwareDecoder(parameters.hasVP9HardwareDecoder)
+static GPUProcessConnectionParameters getGPUProcessConnectionParameters()
+{
+    GPUProcessConnectionParameters parameters;
+#if PLATFORM(COCOA)
+    parameters.webProcessIdentity = ProcessIdentity { ProcessIdentity::CurrentProcess };
+    parameters.overrideLanguages = userPreferredLanguagesOverride();
 #endif
+    return parameters;
+}
+
+RefPtr<GPUProcessConnection> GPUProcessConnection::create(IPC::Connection& parentConnection)
 {
+    auto connectionIdentifiers = IPC::Connection::createConnectionIdentifierPair();
+    if (!connectionIdentifiers)
+        return nullptr;
+
+    parentConnection.send(Messages::WebProcessProxy::CreateGPUProcessConnection(connectionIdentifiers->client, getGPUProcessConnectionParameters()), 0);
+
+    auto instance = adoptRef(*new GPUProcessConnection(WTFMove(connectionIdentifiers->server)));
+#if ENABLE(IPC_TESTING_API)
+    if (parentConnection.ignoreInvalidMessageForTesting())
+        instance->connection().setIgnoreInvalidMessageForTesting();
+#endif
+    return instance;
+}
+
+GPUProcessConnection::GPUProcessConnection(IPC::Connection::Identifier&& connectionIdentifier)
+    : m_connection(IPC::Connection::createServerConnection(connectionIdentifier, *this))
+{
     m_connection->open();
 
     addLanguageChangeObserver(this, languagesChanged);
@@ -133,6 +159,21 @@
     removeLanguageChangeObserver(this);
 }
 
+#if HAVE(AUDIT_TOKEN)
+std::optional<audit_token_t> GPUProcessConnection::auditToken()
+{
+    if (!waitForDidInitialize())
+        return std::nullopt;
+    return m_auditToken;
+}
+#endif
+
+void GPUProcessConnection::invalidate()
+{
+    m_connection->invalidate();
+    m_hasInitialized = true;
+}
+
 void GPUProcessConnection::didClose(IPC::Connection&)
 {
     auto protector = Ref { *this };
@@ -260,6 +301,30 @@
     return messageReceiverMap().dispatchSyncMessage(connection, decoder, replyEncoder);
 }
 
+void GPUProcessConnection::didInitialize(std::optional<GPUProcessConnectionInfo>&& info)
+{
+    if (!info) {
+        invalidate();
+        return;
+    }
+    m_hasInitialized = true;
+#if ENABLE(VP9)
+    m_hasVP9HardwareDecoder = info->hasVP9HardwareDecoder;
+#endif
+}
+
+bool GPUProcessConnection::waitForDidInitialize()
+{
+    if (!m_hasInitialized) {
+        bool result = m_connection->waitForAndDispatchImmediately<Messages::GPUProcessConnection::DidInitialize>(0, defaultTimeout);
+        if (!result) {
+            invalidate();
+            return false;
+        }
+    }
+    return m_connection->isValid();
+}
+
 void GPUProcessConnection::didReceiveRemoteCommand(PlatformMediaSession::RemoteControlCommandType type, const PlatformMediaSession::RemoteCommandArgument& argument)
 {
     PlatformMediaSessionManager::sharedManager().processDidReceiveRemoteControlCommand(type, argument);
@@ -316,6 +381,14 @@
     m_enableVP9SWDecoder = enableVP9SWDecoder;
     connection().send(Messages::GPUConnectionToWebProcess::EnableVP9Decoders(enableVP8Decoder, enableVP9Decoder, enableVP9SWDecoder), { });
 }
+
+bool GPUProcessConnection::hasVP9HardwareDecoder()
+{
+    if (!waitForDidInitialize())
+        return false;
+    return m_hasVP9HardwareDecoder;
+}
+
 #endif
 
 void GPUProcessConnection::updateMediaConfiguration()

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -53,7 +53,7 @@
 class RemoteMediaPlayerManager;
 class SampleBufferDisplayLayerManager;
 class WebPage;
-struct GPUProcessConnectionInitializationParameters;
+struct GPUProcessConnectionInfo;
 struct OverrideScreenDataForTesting;
 struct WebPageCreationParameters;
 
@@ -63,10 +63,7 @@
 
 class GPUProcessConnection : public RefCounted<GPUProcessConnection>, public IPC::Connection::Client {
 public:
-    static Ref<GPUProcessConnection> create(IPC::Connection::Identifier connectionIdentifier, const GPUProcessConnectionInitializationParameters& parameters)
-    {
-        return adoptRef(*new GPUProcessConnection(connectionIdentifier, parameters));
-    }
+    static RefPtr<GPUProcessConnection> create(IPC::Connection& parentConnection);
     ~GPUProcessConnection();
     
     IPC::Connection& connection() { return m_connection.get(); }
@@ -73,10 +70,7 @@
     IPC::MessageReceiverMap& messageReceiverMap() { return m_messageReceiverMap; }
 
 #if HAVE(AUDIT_TOKEN)
-    void setAuditToken(std::optional<audit_token_t> auditToken) { m_auditToken = auditToken; }
-    std::optional<audit_token_t> auditToken() const { return m_auditToken; }
-
-    void setPresentingApplicationAuditToken(std::optional<audit_token_t>&&);
+    std::optional<audit_token_t> auditToken();
 #endif
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
     SampleBufferDisplayLayerManager& sampleBufferDisplayLayerManager();
@@ -100,7 +94,7 @@
     bool isVP8DecoderEnabled() const { return m_enableVP8Decoder; }
     bool isVP9DecoderEnabled() const { return m_enableVP9Decoder; }
     bool isVPSWDecoderEnabled() const { return m_enableVP9SWDecoder; }
-    bool hasVP9HardwareDecoder() const { return m_hasVP9HardwareDecoder; }
+    bool hasVP9HardwareDecoder();
 #endif
 
 #if HAVE(VISIBILITY_PROPAGATION_VIEW)
@@ -119,8 +113,11 @@
     void addClient(const Client& client) { m_clients.add(client); }
     void removeClient(const Client& client) { m_clients.remove(client); }
 
+    static constexpr Seconds defaultTimeout = 3_s;
 private:
-    GPUProcessConnection(IPC::Connection::Identifier, const GPUProcessConnectionInitializationParameters&);
+    GPUProcessConnection(IPC::Connection::Identifier&&);
+    bool waitForDidInitialize();
+    void invalidate();
 
     // IPC::Connection::Client
     void didClose(IPC::Connection&) override;
@@ -131,7 +128,9 @@
     bool dispatchMessage(IPC::Connection&, IPC::Decoder&);
     bool dispatchSyncMessage(IPC::Connection&, IPC::Decoder&, UniqueRef<IPC::Encoder>&);
 
+    // Messages.
     void didReceiveRemoteCommand(WebCore::PlatformMediaSession::RemoteControlCommandType, const WebCore::PlatformMediaSession::RemoteCommandArgument&);
+    void didInitialize(std::optional<GPUProcessConnectionInfo>&&);
 
 #if ENABLE(ROUTING_ARBITRATION)
     void beginRoutingArbitrationWithCategory(WebCore::AudioSession::CategoryType, WebCore::AudioSessionRoutingArbitrationClient::ArbitrationCallback&&);
@@ -141,7 +140,7 @@
     // The connection from the web process to the GPU process.
     Ref<IPC::Connection> m_connection;
     IPC::MessageReceiverMap m_messageReceiverMap;
-
+    bool m_hasInitialized { false };
 #if HAVE(AUDIT_TOKEN)
     std::optional<audit_token_t> m_auditToken;
 #endif

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.messages.in (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.messages.in	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.messages.in	2022-05-05 13:42:39 UTC (rev 293829)
@@ -23,6 +23,7 @@
 #if ENABLE(GPU_PROCESS)
 
 messages -> GPUProcessConnection WantsDispatchMessage {
+    DidInitialize(std::optional<WebKit::GPUProcessConnectionInfo> info)
     DidReceiveRemoteCommand(enum:uint8_t WebCore::PlatformMediaSession::RemoteControlCommandType type, struct WebCore::PlatformMediaSession::RemoteCommandArgument argument)
 
 #if ENABLE(ROUTING_ARBITRATION)

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnectionInfo.h (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnectionInfo.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnectionInfo.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -27,65 +27,47 @@
 
 #if ENABLE(GPU_PROCESS)
 
-#include "GPUProcessConnectionInitializationParameters.h"
+#include "ArgumentCoders.h"
+#include <optional>
 
 namespace WebKit {
 
 struct GPUProcessConnectionInfo {
-    IPC::Attachment connection;
 #if HAVE(AUDIT_TOKEN)
     std::optional<audit_token_t> auditToken;
 #endif
-    GPUProcessConnectionInitializationParameters parameters;
-
-    IPC::Connection::Identifier identifier() const
-    {
-#if USE(UNIX_DOMAIN_SOCKETS)
-        return IPC::Connection::Identifier(connection.fd().value());
-#elif OS(DARWIN)
-        return IPC::Connection::Identifier(connection.port());
-#elif OS(WINDOWS)
-        return IPC::Connection::Identifier(connection.handle());
-#else
-        ASSERT_NOT_REACHED();
-        return IPC::Connection::Identifier();
+#if ENABLE(VP9)
+    bool hasVP9HardwareDecoder { false };
 #endif
-    }
 
-    IPC::Connection::Identifier releaseIdentifier()
-    {
-#if USE(UNIX_DOMAIN_SOCKETS)
-        auto returnValue = IPC::Connection::Identifier(connection.release().release());
-#else
-        auto returnValue = identifier();
-#endif
-        connection = { };
-        return returnValue;
-    }
-
     void encode(IPC::Encoder& encoder) const
     {
-        encoder << connection;
 #if HAVE(AUDIT_TOKEN)
         encoder << auditToken;
 #endif
-        encoder << parameters;
+#if ENABLE(VP9)
+        encoder << hasVP9HardwareDecoder;
+#endif
     }
-    
-    static WARN_UNUSED_RETURN bool decode(IPC::Decoder& decoder, GPUProcessConnectionInfo& info)
+
+    static WARN_UNUSED_RETURN std::optional<GPUProcessConnectionInfo> decode(IPC::Decoder& decoder)
     {
-        if (!decoder.decode(info.connection))
-            return false;
 #if HAVE(AUDIT_TOKEN)
-        if (!decoder.decode(info.auditToken))
-            return false;
+        auto auditToken = decoder.decode<std::optional<audit_token_t>>();
 #endif
-        std::optional<GPUProcessConnectionInitializationParameters> parameters;
-        decoder >> parameters;
-        if (!parameters)
-            return false;
-        info.parameters = WTFMove(*parameters);
-        return true;
+#if ENABLE(VP9)
+        auto hasVP9HardwareDecoder = decoder.decode<bool>();
+#endif
+        if (!decoder.isValid())
+            return std::nullopt;
+        return GPUProcessConnectionInfo {
+#if HAVE(AUDIT_TOKEN)
+            *auditToken,
+#endif
+#if ENABLE(VP9)
+            *hasVP9HardwareDecoder,
+#endif
+        };
     }
 };
 

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2022-05-05 13:42:39 UTC (rev 293829)
@@ -191,7 +191,6 @@
 #if ENABLE(GPU_PROCESS)
 #include "GPUConnectionToWebProcessMessages.h"
 #include "GPUProcessConnection.h"
-#include "GPUProcessConnectionInfo.h"
 #endif
 
 #if ENABLE(WEB_AUTHN)
@@ -1297,30 +1296,6 @@
 
 #if ENABLE(GPU_PROCESS)
 
-#if !PLATFORM(COCOA)
-void WebProcess::platformInitializeGPUProcessConnectionParameters(GPUProcessConnectionParameters&)
-{
-}
-#endif
-
-GPUProcessConnectionInfo WebProcess::getGPUProcessConnection(IPC::Connection& connection)
-{
-    GPUProcessConnectionParameters parameters;
-    platformInitializeGPUProcessConnectionParameters(parameters);
-
-    IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope;
-
-    GPUProcessConnectionInfo connectionInfo;
-    if (!connection.sendSync(Messages::WebProcessProxy::GetGPUProcessConnection(parameters), Messages::WebProcessProxy::GetGPUProcessConnection::Reply(connectionInfo), 0)) {
-        // If we failed the first time, retry once. The attachment may have become invalid
-        // before it was received by the web process if the network process crashed.
-        if (!connection.sendSync(Messages::WebProcessProxy::GetGPUProcessConnection(parameters), Messages::WebProcessProxy::GetGPUProcessConnection::Reply(connectionInfo), 0))
-            failedToSendSyncMessage();
-    }
-
-    return connectionInfo;
-}
-
 GPUProcessConnection& WebProcess::ensureGPUProcessConnection()
 {
     RELEASE_ASSERT(RunLoop::isMain());
@@ -1327,26 +1302,8 @@
 
     // If we've lost our connection to the GPU process (e.g. it crashed) try to re-establish it.
     if (!m_gpuProcessConnection) {
-        auto connectionInfo = getGPUProcessConnection(*parentProcessConnection());
+        m_gpuProcessConnection = GPUProcessConnection::create(*parentProcessConnection());
 
-        // Retry once if the IPC to get the connectionIdentifier succeeded but the connectionIdentifier we received
-        // is invalid. This may indicate that the GPU process has crashed.
-        if (!IPC::Connection::identifierIsValid(connectionInfo.identifier()))
-            connectionInfo = getGPUProcessConnection(*parentProcessConnection());
-
-        if (!IPC::Connection::identifierIsValid(connectionInfo.identifier()))
-            CRASH();
-
-        m_gpuProcessConnection = GPUProcessConnection::create(connectionInfo.releaseIdentifier(), connectionInfo.parameters);
-#if HAVE(AUDIT_TOKEN)
-        ASSERT(connectionInfo.auditToken);
-        m_gpuProcessConnection->setAuditToken(WTFMove(connectionInfo.auditToken));
-#endif
-#if ENABLE(IPC_TESTING_API)
-        if (parentProcessConnection()->ignoreInvalidMessageForTesting())
-            m_gpuProcessConnection->connection().setIgnoreInvalidMessageForTesting();
-#endif
-
         for (auto& page : m_pageMap.values()) {
             // If page is null, then it is currently being constructed.
             if (page)

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2022-05-05 13:42:39 UTC (rev 293829)
@@ -143,8 +143,6 @@
 class WebPageGroupProxy;
 class WebProcessSupplement;
 
-struct GPUProcessConnectionInfo;
-struct GPUProcessConnectionParameters;
 struct RemoteWorkerInitializationData;
 struct UserMessage;
 struct WebProcessCreationParameters;
@@ -586,11 +584,6 @@
     void updateFreezerStatus();
 #endif
 
-#if ENABLE(GPU_PROCESS)
-    static GPUProcessConnectionInfo getGPUProcessConnection(IPC::Connection&);
-    static void platformInitializeGPUProcessConnectionParameters(GPUProcessConnectionParameters&);
-#endif
-
 #if ENABLE(VIDEO)
     void suspendAllMediaBuffering();
     void resumeAllMediaBuffering();

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (293828 => 293829)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2022-05-05 12:12:52 UTC (rev 293828)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2022-05-05 13:42:39 UTC (rev 293829)
@@ -27,7 +27,6 @@
 #import "WebProcess.h"
 
 #import "AccessibilitySupportSPI.h"
-#import "GPUProcessConnectionParameters.h"
 #import "LaunchServicesDatabaseManager.h"
 #import "LegacyCustomProtocolManager.h"
 #import "LogInitialization.h"
@@ -1246,15 +1245,6 @@
     }
 }
 
-#if ENABLE(GPU_PROCESS)
-void WebProcess::platformInitializeGPUProcessConnectionParameters(GPUProcessConnectionParameters& parameters)
-{
-    parameters.webProcessIdentity = ProcessIdentity { ProcessIdentity::CurrentProcess };
-
-    parameters.overrideLanguages = userPreferredLanguagesOverride();
-}
-#endif
-
 #if PLATFORM(MAC)
 void WebProcess::systemWillPowerOn()
 {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to