[PATCH 4/4] winegstreamer: Mark winegstreamer.so as NODELETE instead of pinning winegstreamer.dll.

Zebediah Figura zfigura at codeweavers.com
Mon Oct 4 19:20:52 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/winegstreamer/Makefile.in     |  4 +++-
 dlls/winegstreamer/gst_private.h   |  2 --
 dlls/winegstreamer/main.c          | 26 --------------------------
 dlls/winegstreamer/quartz_parser.c | 19 -------------------
 4 files changed, 3 insertions(+), 48 deletions(-)

diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in
index e35df3cf3f9..95c2d885482 100644
--- a/dlls/winegstreamer/Makefile.in
+++ b/dlls/winegstreamer/Makefile.in
@@ -3,7 +3,9 @@ UNIXLIB   = winegstreamer.so
 IMPORTS   = strmbase strmiids uuid ole32 mfuuid
 DELAYIMPORTS = mfplat
 EXTRAINCL = $(GSTREAMER_CFLAGS)
-EXTRALIBS = $(GSTREAMER_LIBS) $(PTHREAD_LIBS)
+# GLib pins some of its own libraries, and breaks if libraries that import it
+# try to initialize themselves after being unloaded.
+EXTRALIBS = $(GSTREAMER_LIBS) $(PTHREAD_LIBS) -Wl,-z,nodelete
 
 C_SRCS = \
 	audioconvert.c \
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index ebe0bf6f50d..c141dd44921 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -98,8 +98,6 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN
 HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
 HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
 
-BOOL init_gstreamer(void) DECLSPEC_HIDDEN;
-
 extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN;
 extern HRESULT mfplat_DllRegisterServer(void) DECLSPEC_HIDDEN;
 
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c
index c799aa06d1b..6b2b70f9c60 100644
--- a/dlls/winegstreamer/main.c
+++ b/dlls/winegstreamer/main.c
@@ -318,9 +318,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
 
     TRACE("clsid %s, iid %s, out %p.\n", debugstr_guid(clsid), debugstr_guid(iid), out);
 
-    if (!init_gstreamer())
-        return CLASS_E_CLASSNOTAVAILABLE;
-
     if (SUCCEEDED(hr = mfplat_get_class_object(clsid, iid, out)))
         return hr;
 
@@ -341,29 +338,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
     return IClassFactory_QueryInterface(&factory->IClassFactory_iface, iid, out);
 }
 
-static BOOL CALLBACK init_gstreamer_proc(INIT_ONCE *once, void *param, void **ctx)
-{
-    HINSTANCE handle;
-
-    /* Unloading glib is a bad idea.. it installs atexit handlers,
-     * so never unload the dll after loading */
-    GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN,
-            (LPCWSTR)init_gstreamer_proc, &handle);
-    if (!handle)
-        ERR("Failed to pin module.\n");
-
-    return TRUE;
-}
-
-BOOL init_gstreamer(void)
-{
-    static INIT_ONCE once = INIT_ONCE_STATIC_INIT;
-
-    InitOnceExecuteOnce(&once, init_gstreamer_proc, NULL, NULL);
-
-    return TRUE;
-}
-
 static const REGPINTYPES reg_audio_mt = {&MEDIATYPE_Audio, &GUID_NULL};
 static const REGPINTYPES reg_stream_mt = {&MEDIATYPE_Stream, &GUID_NULL};
 static const REGPINTYPES reg_video_mt = {&MEDIATYPE_Video, &GUID_NULL};
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 6ae1a99a14a..d6a58801f51 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -1098,20 +1098,10 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin,
     return VFW_S_NO_MORE_ITEMS;
 }
 
-static BOOL parser_init_gstreamer(void)
-{
-    if (!init_gstreamer())
-        return FALSE;
-    return TRUE;
-}
-
 HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
 {
     struct parser *object;
 
-    if (!parser_init_gstreamer())
-        return E_FAIL;
-
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
@@ -1634,9 +1624,6 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out)
 {
     struct parser *object;
 
-    if (!parser_init_gstreamer())
-        return E_FAIL;
-
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
@@ -1720,9 +1707,6 @@ HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out)
 {
     struct parser *object;
 
-    if (!parser_init_gstreamer())
-        return E_FAIL;
-
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
@@ -1827,9 +1811,6 @@ HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out)
 {
     struct parser *object;
 
-    if (!parser_init_gstreamer())
-        return E_FAIL;
-
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
-- 
2.33.0




More information about the wine-devel mailing list