Skip to content

Commit fe61765

Browse files
philncalvaris
authored andcommitted
[GStreamer] De-initialize only if leaks tracer is active
https://bugs.webkit.org/show_bug.cgi?id=268977 Reviewed by Xabier Rodriguez-Calvar. The `gst_deinit()` call is useful only if the leaks tracer is active. Otherwise resources will be freed anyway when the WebProcess terminates. * Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.cpp: (WTF::adoptGRef): (WTF::refGPtr<GstTracer>): (WTF::derefGPtr<GstTracer>): * Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.h: * Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp: (WebCore::deinitializeGStreamer): Canonical link: https://commits.webkit.org/274811@main
1 parent 4026673 commit fe61765

3 files changed

Lines changed: 38 additions & 0 deletions

File tree

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,28 @@ void derefGPtr<GstDevice>(GstDevice* ptr)
549549
gst_object_unref(ptr);
550550
}
551551

552+
template<>
553+
GRefPtr<GstTracer> adoptGRef(GstTracer* ptr)
554+
{
555+
return GRefPtr<GstTracer>(ptr, GRefPtrAdopt);
556+
}
557+
558+
template<>
559+
GstTracer* refGPtr<GstTracer>(GstTracer* ptr)
560+
{
561+
if (ptr)
562+
gst_object_ref(GST_OBJECT_CAST(ptr));
563+
564+
return ptr;
565+
}
566+
567+
template<>
568+
void derefGPtr<GstTracer>(GstTracer* ptr)
569+
{
570+
if (ptr)
571+
gst_object_unref(ptr);
572+
}
573+
552574
template <> GRefPtr<WebKitVideoSink> adoptGRef(WebKitVideoSink* ptr)
553575
{
554576
ASSERT(!ptr || !g_object_is_floating(ptr));

Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ template<> GRefPtr<GstDevice> adoptGRef(GstDevice*);
173173
template<> GstDevice* refGPtr<GstDevice>(GstDevice*);
174174
template<> void derefGPtr<GstDevice>(GstDevice*);
175175

176+
template<> GRefPtr<GstTracer> adoptGRef(GstTracer*);
177+
template<> GstTracer* refGPtr<GstTracer>(GstTracer*);
178+
template<> void derefGPtr<GstTracer>(GstTracer*);
179+
176180
#if USE(GSTREAMER_GL)
177181
template<> GRefPtr<GstGLDisplay> adoptGRef(GstGLDisplay* ptr);
178182
template<> GstGLDisplay* refGPtr<GstGLDisplay>(GstGLDisplay* ptr);

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,18 @@ void deinitializeGStreamer()
497497
teardownVideoEncoderSingleton();
498498
#endif
499499

500+
bool isLeaksTracerActive = false;
501+
auto activeTracers = gst_tracing_get_active_tracers();
502+
while (activeTracers) {
503+
auto tracer = adoptGRef(GST_TRACER_CAST(activeTracers->data));
504+
if (!isLeaksTracerActive && !g_strcmp0(G_OBJECT_TYPE_NAME(G_OBJECT(tracer.get())), "GstLeaksTracer"))
505+
isLeaksTracerActive = true;
506+
activeTracers = g_list_delete_link(activeTracers, activeTracers);
507+
}
508+
509+
if (!isLeaksTracerActive)
510+
return;
511+
500512
// Make sure there is no active pipeline left. Those might trigger deadlocks during gst_deinit().
501513
{
502514
Locker locker { s_activePipelinesMapLock };

0 commit comments

Comments
 (0)