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()
{