libxml: fix plugin re-entrancy - refs #2541
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 20 Feb 2009 16:52:47 +0000 (18:52 +0200)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 20 Feb 2009 16:54:16 +0000 (18:54 +0200)
modules/misc/xml/libxml.c

index f4bad58..28a6696 100644 (file)
@@ -67,6 +67,9 @@ 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;
+static vlc_mutex_t lock = VLC_STATIC_MUTEX;
+
 /*****************************************************************************
  * Module initialization
  *****************************************************************************/
@@ -74,7 +77,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 +99,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;
 }