Skip to content

Commit b8636c4

Browse files
philncalvaris
authored andcommitted
[GStreamer] HTTP source element leaks
https://bugs.webkit.org/show_bug.cgi?id=266177 Reviewed by Xabier Rodriguez-Calvar. There was a reference cycle between the CachedResourceStreamingClient and WebKitWebSrc. Also, sending a new ref of WebKitWebSrc to the main thread during basesrc::unlock was inducing an additional leak. * Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: (webKitWebSrcMakeRequest): (webKitWebSrcUnLock): (CachedResourceStreamingClient::CachedResourceStreamingClient): (CachedResourceStreamingClient::checkUpdateBlocksize): (CachedResourceStreamingClient::responseReceived): (CachedResourceStreamingClient::dataReceived): (CachedResourceStreamingClient::accessControlCheckFailed): (CachedResourceStreamingClient::loadFailed): (CachedResourceStreamingClient::loadFinished): Canonical link: https://commits.webkit.org/271864@main
1 parent 2dc6b52 commit b8636c4

1 file changed

Lines changed: 13 additions & 15 deletions

File tree

Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,11 @@ class CachedResourceStreamingClient final : public PlatformMediaResourceClient {
5959
WTF_MAKE_FAST_ALLOCATED;
6060
WTF_MAKE_NONCOPYABLE(CachedResourceStreamingClient);
6161
public:
62-
CachedResourceStreamingClient(WebKitWebSrc*, ResourceRequest&&, unsigned requestNumber);
62+
CachedResourceStreamingClient(const WebKitWebSrc&, ResourceRequest&&, unsigned requestNumber);
6363
virtual ~CachedResourceStreamingClient();
6464

6565
const HashSet<RefPtr<WebCore::SecurityOrigin>>& securityOrigins() const { return m_origins; }
6666

67-
void setSourceElement(WebKitWebSrc* src) { m_src = GST_ELEMENT_CAST(src); }
68-
6967
private:
7068
void checkUpdateBlocksize(unsigned bytesRead);
7169

@@ -86,7 +84,7 @@ class CachedResourceStreamingClient final : public PlatformMediaResourceClient {
8684
int m_increaseBlocksizeCount { 0 };
8785
unsigned m_requestNumber;
8886

89-
GRefPtr<GstElement> m_src;
87+
const GstElement* m_src;
9088
ResourceRequest m_request;
9189
HashSet<RefPtr<WebCore::SecurityOrigin>> m_origins;
9290
};
@@ -710,7 +708,7 @@ static void webKitWebSrcMakeRequest(WebKitWebSrc* src, DataMutexLocker<WebKitWeb
710708
PlatformMediaResourceLoader::LoadOptions loadOptions = 0;
711709
members->resource = members->loader->requestResource(ResourceRequest(request), loadOptions);
712710
if (members->resource) {
713-
members->resource->setClient(adoptRef(*new CachedResourceStreamingClient(protector.get(), ResourceRequest(request), requestNumber)));
711+
members->resource->setClient(adoptRef(*new CachedResourceStreamingClient(*protector.get(), ResourceRequest(request), requestNumber)));
714712
GST_DEBUG_OBJECT(protector.get(), "Started request R%u", requestNumber);
715713
} else {
716714
GST_ERROR_OBJECT(protector.get(), "Failed to setup streaming client to handle R%u", requestNumber);
@@ -824,8 +822,8 @@ static gboolean webKitWebSrcUnLock(GstBaseSrc* baseSrc)
824822
// If we have a network resource request open, we ask the main thread to close it.
825823
if (members->resource) {
826824
GST_DEBUG_OBJECT(src, "Resource request R%u will be stopped", members->requestNumber);
827-
RunLoop::main().dispatch([protector = WTF::ensureGRef(src), resource = WTFMove(members->resource), requestNumber = members->requestNumber] {
828-
GST_DEBUG_OBJECT(protector.get(), "Stopping resource request R%u", requestNumber);
825+
RunLoop::main().dispatch([resource = WTFMove(members->resource), requestNumber = members->requestNumber] {
826+
GST_DEBUG("Stopping resource request R%u", requestNumber);
829827
resource->stop();
830828
resource->setClient(nullptr);
831829
});
@@ -943,9 +941,9 @@ bool webKitSrcPassedCORSAccessCheck(WebKitWebSrc* src)
943941
return members->didPassAccessControlCheck;
944942
}
945943

946-
CachedResourceStreamingClient::CachedResourceStreamingClient(WebKitWebSrc* src, ResourceRequest&& request, unsigned requestNumber)
944+
CachedResourceStreamingClient::CachedResourceStreamingClient(const WebKitWebSrc& src, ResourceRequest&& request, unsigned requestNumber)
947945
: m_requestNumber(requestNumber)
948-
, m_src(GST_ELEMENT(src))
946+
, m_src(GST_ELEMENT_CAST(&src))
949947
, m_request(WTFMove(request))
950948
{
951949
}
@@ -955,7 +953,7 @@ CachedResourceStreamingClient::~CachedResourceStreamingClient() = default;
955953
void CachedResourceStreamingClient::checkUpdateBlocksize(unsigned bytesRead)
956954
{
957955
ASSERT(isMainThread());
958-
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src.get());
956+
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
959957
GstBaseSrc* baseSrc = GST_BASE_SRC_CAST(src);
960958
WebKitWebSrcPrivate* priv = src->priv;
961959

@@ -992,7 +990,7 @@ void CachedResourceStreamingClient::checkUpdateBlocksize(unsigned bytesRead)
992990
void CachedResourceStreamingClient::responseReceived(PlatformMediaResource&, const ResourceResponse& response, CompletionHandler<void(ShouldContinuePolicyCheck)>&& completionHandler)
993991
{
994992
ASSERT(isMainThread());
995-
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src.get());
993+
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
996994
WebKitWebSrcPrivate* priv = src->priv;
997995
DataMutexLocker members { priv->dataMutex };
998996
if (members->requestNumber != m_requestNumber) {
@@ -1106,7 +1104,7 @@ void CachedResourceStreamingClient::responseReceived(PlatformMediaResource&, con
11061104
void CachedResourceStreamingClient::dataReceived(PlatformMediaResource&, const SharedBuffer& data)
11071105
{
11081106
ASSERT(isMainThread());
1109-
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src.get());
1107+
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
11101108
WebKitWebSrcPrivate* priv = src->priv;
11111109

11121110
DataMutexLocker members { priv->dataMutex };
@@ -1145,7 +1143,7 @@ void CachedResourceStreamingClient::dataReceived(PlatformMediaResource&, const S
11451143
void CachedResourceStreamingClient::accessControlCheckFailed(PlatformMediaResource&, const ResourceError& error)
11461144
{
11471145
ASSERT(isMainThread());
1148-
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src.get());
1146+
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
11491147
DataMutexLocker members { src->priv->dataMutex };
11501148
if (members->requestNumber != m_requestNumber)
11511149
return;
@@ -1158,7 +1156,7 @@ void CachedResourceStreamingClient::accessControlCheckFailed(PlatformMediaResour
11581156
void CachedResourceStreamingClient::loadFailed(PlatformMediaResource&, const ResourceError& error)
11591157
{
11601158
ASSERT(isMainThread());
1161-
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src.get());
1159+
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
11621160
DataMutexLocker members { src->priv->dataMutex };
11631161
if (members->requestNumber != m_requestNumber)
11641162
return;
@@ -1176,7 +1174,7 @@ void CachedResourceStreamingClient::loadFailed(PlatformMediaResource&, const Res
11761174
void CachedResourceStreamingClient::loadFinished(PlatformMediaResource&, const NetworkLoadMetrics&)
11771175
{
11781176
ASSERT(isMainThread());
1179-
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src.get());
1177+
WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
11801178
DataMutexLocker members { src->priv->dataMutex };
11811179
if (members->requestNumber != m_requestNumber)
11821180
return;

0 commit comments

Comments
 (0)