[vlc-devel] commit: libxml: ugly fix for plugin re-entrancy - refs #2541 ( Rémi Denis-Courmont )

git version control git at videolan.org
Sun Feb 22 19:21:32 CET 2009


vlc | branch: 0.9-bugfix | Rémi Denis-Courmont <rdenis at simphalempin.com> | Fri Feb 20 18:52:47 2009 +0200| [0fc400924a5bd1165ca78803db8989e377d1abd1] | committer: Rémi Denis-Courmont 

libxml: ugly fix for plugin re-entrancy - refs #2541

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0fc400924a5bd1165ca78803db8989e377d1abd1
---

 modules/misc/xml/libxml.c |   39 +++++++++++++++++++++++++++++++++++++--
 1 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/modules/misc/xml/libxml.c b/modules/misc/xml/libxml.c
index 1b25a82..e5de2f1 100644
--- a/modules/misc/xml/libxml.c
+++ b/modules/misc/xml/libxml.c
@@ -67,6 +67,31 @@ static void CatalogLoad( xml_t *, const char * );
 static void CatalogAdd( xml_t *, const char *, const char *, const char * );
 static int StreamRead( void *p_context, char *p_buffer, int i_buffer );
 
+static unsigned refs = 0;
+#if defined (LIBVLC_USE_PTHREAD)
+static vlc_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+#elif defined (WIN32)
+BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
+{
+    (void) hinstDll;
+    (void) lpvReserved;
+
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            vlc_mutex_init (&lock);
+            break;
+
+        case DLL_PROCESS_DETACH:
+            vlc_mutex_destroy (&lock);
+            break;
+    }
+    return TRUE;
+}
+#else
+# error FIXME
+#endif
+
 /*****************************************************************************
  * Module initialization
  *****************************************************************************/
@@ -74,7 +99,13 @@ static int Open( vlc_object_t *p_this )
 {
     xml_t *p_xml = (xml_t *)p_this;
 
-    xmlInitParser();
+    if( !xmlHasFeature( XML_WITH_THREAD ) )
+        return VLC_EGENERIC;
+
+    vlc_mutex_lock( &lock );
+    if( refs++ == 0 )
+        xmlInitParser();
+    vlc_mutex_unlock( &lock );
 
     p_xml->pf_reader_create = ReaderCreate;
     p_xml->pf_reader_delete = ReaderDelete;
@@ -90,7 +121,11 @@ static int Open( vlc_object_t *p_this )
  *****************************************************************************/
 static void Close( vlc_object_t *p_this )
 {
-    xmlCleanupParser();
+    vlc_mutex_lock( &lock );
+    if( --refs == 0 )
+        xmlCleanupParser();
+    vlc_mutex_unlock( &lock );
+
     VLC_UNUSED(p_this);
     return;
 }




More information about the vlc-devel mailing list