Skip to content

Commit

Permalink
REGRESSION(267193@main): [ Debug ] TestWebKitAPI.WebKit2.CrashGPUProc…
Browse files Browse the repository at this point in the history
…essWhileCapturingAndCalling is a near-constant failure.

https://bugs.webkit.org/show_bug.cgi?id=262145
rdar://116083315

Reviewed by Chris Dumez.

We moved LibWebRTCCodecsProxy::createEncoder to be an async callback and updated the regular code path in LibWebRTCCodecs.
But we forgot to update the GPUProcess crash code path.
We introduce a routine that is used for both code paths.

* Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
(WebKit::createRemoteEncoder):
(WebKit::LibWebRTCCodecs::createEncoderInternal):
(WebKit::LibWebRTCCodecs::gpuProcessConnectionDidClose):
* Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:

Canonical link: https://commits.webkit.org/269537@main
  • Loading branch information
youennf committed Oct 19, 2023
1 parent 711e9d2 commit 1556c6a
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
11 changes: 8 additions & 3 deletions Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,11 @@ void LibWebRTCCodecs::createEncoderAndWaitUntilInitialized(VideoCodecType type,
});
}

static void createRemoteEncoder(LibWebRTCCodecs::Encoder& encoder, IPC::Connection& connection, const Vector<std::pair<String, String>>& parameters, Function<void(bool)>&& callback)
{
connection.sendWithAsyncReply(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoder.identifier, encoder.type, encoder.codec, parameters, encoder.isRealtime, encoder.useAnnexB, encoder.scalabilityMode }, WTFMove(callback), 0);
}

LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoderInternal(VideoCodecType type, const String& codec, const std::map<std::string, std::string>& formatParameters, bool isRealtime, bool useAnnexB, VideoEncoderScalabilityMode scalabilityMode, Function<void(Encoder*)>&& callback)
{
auto encoder = makeUnique<Encoder>();
Expand All @@ -581,7 +586,7 @@ LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoderInternal(VideoCodecType

{
Locker locker { m_encodersConnectionLock };
connection->sendWithAsyncReply(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoder->identifier, encoder->type, encoder->codec, parameters, encoder->isRealtime, encoder->useAnnexB, encoder->scalabilityMode }, [identifier = encoder->identifier, callback = WTFMove(callback)](bool result) mutable {
createRemoteEncoder(*encoder, connection.get(), parameters, [identifier = encoder->identifier, callback = WTFMove(callback)](bool result) mutable {
WebProcess::singleton().libWebRTCCodecs().m_queue->dispatch([identifier, result, callback = WTFMove(callback)]() mutable {
if (!result) {
callback(nullptr);
Expand All @@ -592,7 +597,7 @@ LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoderInternal(VideoCodecType
assertIsCurrent(codecs.workQueue());
callback(codecs.m_encoders.get(identifier));
});
}, 0);
});
setEncoderConnection(*encoder, connection.ptr());
}

Expand Down Expand Up @@ -848,7 +853,7 @@ void LibWebRTCCodecs::gpuProcessConnectionDidClose(GPUProcessConnection&)

Locker locker { m_encodersConnectionLock };
for (auto& encoder : m_encoders.values()) {
connection->send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoder->identifier, encoder->type, encoder->codec, encoder->parameters, encoder->isRealtime, encoder->useAnnexB, encoder->scalabilityMode }, 0);
createRemoteEncoder(*encoder, *connection, encoder->parameters, [](bool) { });
if (encoder->initializationData)
connection->send(Messages::LibWebRTCCodecsProxy::InitializeEncoder { encoder->identifier, encoder->initializationData->width, encoder->initializationData->height, encoder->initializationData->startBitRate, encoder->initializationData->maxBitRate, encoder->initializationData->minBitRate, encoder->initializationData->maxFrameRate }, 0);
setEncoderConnection(*encoder, connection.get());
Expand Down
3 changes: 1 addition & 2 deletions Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm
Original file line number Diff line number Diff line change
Expand Up @@ -750,8 +750,7 @@ bool waitUntilMicrophoneState(WKWebView *webView, WKMediaCaptureState expectedSt
EXPECT_EQ(webViewPID, [webView _webProcessIdentifier]);
}

// FIXME after rdar://116083315 is resolved.
TEST(WebKit2, DISABLED_CrashGPUProcessWhileCapturingAndCalling)
TEST(WebKit2, CrashGPUProcessWhileCapturingAndCalling)
{
auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
auto preferences = [configuration preferences];
Expand Down

0 comments on commit 1556c6a

Please sign in to comment.