595612 Try to fix some locking problems
authorDaniel Veillard <veillard@redhat.com>
Sun, 20 Sep 2009 09:51:52 +0000 (11:51 +0200)
committerDaniel Veillard <veillard@redhat.com>
Sun, 20 Sep 2009 09:51:52 +0000 (11:51 +0200)
* libxslt/extensions.c: there were still cases where the normal
  code path could led to trying to mtake again the extension lock
  go over all entry points of the module and clean things up

libxslt/extensions.c

index ebb81f5..6187b7a 100644 (file)
@@ -313,8 +313,6 @@ typedef void (*exsltRegisterFunction) (void);
  * by LIBXSLT_DEFAULT_PLUGINS_PATH() which is determined at
  * compile time.
  *
- * Always called with xsltExtMutex lock taken.
- *
  * Returns 0 if successful, -1 in case of error. 
  */
 
@@ -550,10 +548,14 @@ xsltRegisterExtPrefix(xsltStylesheetPtr style,
     if (xsltExtensionsHash != NULL) {
         xsltExtModulePtr module;
 
+        xmlMutexLock(xsltExtMutex);
         module = xmlHashLookup(xsltExtensionsHash, URI);
+        xmlMutexUnlock(xsltExtMutex);
         if (NULL == module) {
             if (!xsltExtModuleRegisterDynamic(URI)) {
+                xmlMutexLock(xsltExtMutex);
                 module = xmlHashLookup(xsltExtensionsHash, URI);
+                xmlMutexUnlock(xsltExtMutex);
             }
         }
         if (module != NULL) {
@@ -1669,18 +1671,13 @@ xsltExtElementLookup(xsltTransformContextPtr ctxt,
     if ((name == NULL) || (URI == NULL))
         return (NULL);
 
-    xmlMutexLock(xsltExtMutex);
-
     if ((ctxt != NULL) && (ctxt->extElements != NULL)) {
         XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->extElements, name, URI);
         if (ret != NULL) {
-            xmlMutexUnlock(xsltExtMutex);
             return(ret);
         }
     }
 
-    xmlMutexUnlock(xsltExtMutex);
-
     ret = xsltExtModuleElementLookup(name, URI);
 
     return (ret);
@@ -1707,19 +1704,23 @@ xsltExtModuleElementLookup(const xmlChar * name, const xmlChar * URI)
 
     ext = (xsltExtElementPtr) xmlHashLookup2(xsltElementsHash, name, URI);
 
+    xmlMutexUnlock(xsltExtMutex);
+
     /*
      * if function lookup fails, attempt a dynamic load on
      * supported platforms
      */
     if (NULL == ext) {
         if (!xsltExtModuleRegisterDynamic(URI)) {
+            xmlMutexLock(xsltExtMutex);
+
             ext = (xsltExtElementPtr)
                  xmlHashLookup2(xsltElementsHash, name, URI);
+
+            xmlMutexUnlock(xsltExtMutex);
         }
     }
 
-    xmlMutexUnlock(xsltExtMutex);
-
     if (ext == NULL)
         return (NULL);
     return (ext->transform);
@@ -1747,13 +1748,18 @@ xsltExtModuleElementPreComputeLookup(const xmlChar * name,
 
     ext = (xsltExtElementPtr) xmlHashLookup2(xsltElementsHash, name, URI);
 
+    xmlMutexUnlock(xsltExtMutex);
+
     if (ext == NULL) {
         if (!xsltExtModuleRegisterDynamic(URI)) {
+            xmlMutexLock(xsltExtMutex);
+
             ext = (xsltExtElementPtr)
                  xmlHashLookup2(xsltElementsHash, name, URI);
+
+            xmlMutexUnlock(xsltExtMutex);
         }
     }
-    xmlMutexUnlock(xsltExtMutex);
 
     if (ext == NULL)
         return (NULL);
@@ -1856,15 +1862,19 @@ xsltExtModuleTopLevelLookup(const xmlChar * name, const xmlChar * URI)
 
     XML_CAST_FPTR(ret) = xmlHashLookup2(xsltTopLevelsHash, name, URI);
 
+    xmlMutexUnlock(xsltExtMutex);
+
     /* if lookup fails, attempt a dynamic load on supported platforms */
     if (NULL == ret) {
         if (!xsltExtModuleRegisterDynamic(URI)) {
+            xmlMutexLock(xsltExtMutex);
+
             XML_CAST_FPTR(ret) = xmlHashLookup2(xsltTopLevelsHash, name, URI);
+
+            xmlMutexUnlock(xsltExtMutex);
         }
     }
 
-    xmlMutexUnlock(xsltExtMutex);
-
     return (ret);
 }