Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: third_party/libxslt/libxslt/extensions.c

Issue 661058: libxslt update (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: '' Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/libxslt/libxslt/extensions.h ('k') | third_party/libxslt/libxslt/extra.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/libxslt/libxslt/extensions.c
===================================================================
--- third_party/libxslt/libxslt/extensions.c (revision 39981)
+++ third_party/libxslt/libxslt/extensions.c (working copy)
@@ -34,8 +34,10 @@
#ifdef _WIN32
#include <stdlib.h> /* for _MAX_PATH */
+#ifndef PATH_MAX
#define PATH_MAX _MAX_PATH
#endif
+#endif
#ifdef WITH_XSLT_DEBUG
#define WITH_XSLT_DEBUG_EXTENSIONS
@@ -84,6 +86,7 @@
static xmlHashTablePtr xsltElementsHash = NULL;
static xmlHashTablePtr xsltTopLevelsHash = NULL;
static xmlHashTablePtr xsltModuleHash = NULL;
+static xmlMutexPtr xsltExtMutex = NULL;
/************************************************************************
* *
@@ -337,10 +340,14 @@
return (-1);
}
+ xmlMutexLock(xsltExtMutex);
+
/* have we attempted to register this module already? */
if (xmlHashLookup(xsltModuleHash, URI) != NULL) {
+ xmlMutexUnlock(xsltExtMutex);
return (-1);
}
+ xmlMutexUnlock(xsltExtMutex);
/* transform extension namespace into a module name */
protocol = xmlStrstr(URI, BAD_CAST "://");
@@ -366,16 +373,17 @@
/* determine module directory */
ext_directory = (xmlChar *) getenv("LIBXSLT_PLUGINS_PATH");
+ if (NULL == ext_directory) {
+ ext_directory = BAD_CAST LIBXSLT_DEFAULT_PLUGINS_PATH();
+ if (NULL == ext_directory)
+ return (-1);
+ }
#ifdef WITH_XSLT_DEBUG_EXTENSIONS
- xsltGenericDebug(xsltGenericDebugContext,
- "LIBXSLT_PLUGINS_PATH is %s\n", ext_directory);
+ else
+ xsltGenericDebug(xsltGenericDebugContext,
+ "LIBXSLT_PLUGINS_PATH is %s\n", ext_directory);
#endif
- if (NULL == ext_directory)
- ext_directory = BAD_CAST LIBXSLT_DEFAULT_PLUGINS_PATH();
- if (NULL == ext_directory)
- return (-1);
-
/* build the module filename, and confirm the module exists */
xmlStrPrintf((xmlChar *) module_filename, sizeof(module_filename),
BAD_CAST "%s/%s%s",
@@ -427,7 +435,9 @@
(*regfunc) ();
/* register this module in our hash */
+ xmlMutexLock(xsltExtMutex);
xmlHashAddEntry(xsltModuleHash, URI, (void *) m);
+ xmlMutexUnlock(xsltExtMutex);
} else {
#ifdef WITH_XSLT_DEBUG_EXTENSIONS
@@ -446,7 +456,7 @@
}
#else
static int
-xsltExtModuleRegisterDynamic(const xmlChar * ATTRIBUTE_UNUSED URI)
+xsltExtModuleRegisterDynamic(const xmlChar * URI ATTRIBUTE_UNUSED)
{
return -1;
}
@@ -538,10 +548,14 @@
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) {
@@ -573,6 +587,8 @@
xsltRegisterExtFunction(xsltTransformContextPtr ctxt, const xmlChar * name,
const xmlChar * URI, xmlXPathFunction function)
{
+ int ret;
+
if ((ctxt == NULL) || (name == NULL) ||
(URI == NULL) || (function == NULL))
return (-1);
@@ -583,8 +599,11 @@
ctxt->extFunctions = xmlHashCreate(10);
if (ctxt->extFunctions == NULL)
return (-1);
- return (xmlHashAddEntry2
- (ctxt->extFunctions, name, URI, XML_CAST_FPTR(function)));
+
+ ret = xmlHashAddEntry2(ctxt->extFunctions, name, URI,
+ XML_CAST_FPTR(function));
+
+ return(ret);
}
/**
@@ -659,7 +678,12 @@
return(NULL);
}
+ xmlMutexLock(xsltExtMutex);
+
module = xmlHashLookup(xsltExtensionsHash, URI);
+
+ xmlMutexUnlock(xsltExtMutex);
+
if (module == NULL) {
#ifdef WITH_XSLT_DEBUG_EXTENSIONS
xsltGenericDebug(xsltGenericDebugContext,
@@ -853,7 +877,12 @@
void *extData;
xsltExtModulePtr module;
+ xmlMutexLock(xsltExtMutex);
+
module = xmlHashLookup(xsltExtensionsHash, URI);
+
+ xmlMutexUnlock(xsltExtMutex);
+
if (module == NULL) {
#ifdef WITH_XSLT_DEBUG_EXTENSIONS
xsltGenericDebug(xsltGenericDebugContext,
@@ -1233,18 +1262,27 @@
if (xsltExtensionsHash == NULL)
return (-1);
+ xmlMutexLock(xsltExtMutex);
+
module = xmlHashLookup(xsltExtensionsHash, URI);
if (module != NULL) {
if ((module->initFunc == initFunc) &&
(module->shutdownFunc == shutdownFunc))
- return (0);
- return (-1);
+ ret = 0;
+ else
+ ret = -1;
+ goto done;
}
module = xsltNewExtModule(initFunc, shutdownFunc,
styleInitFunc, styleShutdownFunc);
- if (module == NULL)
- return (-1);
+ if (module == NULL) {
+ ret = -1;
+ goto done;
+ }
ret = xmlHashAddEntry(xsltExtensionsHash, URI, (void *) module);
+
+done:
+ xmlMutexUnlock(xsltExtMutex);
return (ret);
}
@@ -1285,9 +1323,13 @@
if (xsltExtensionsHash == NULL)
return (-1);
- ret =
- xmlHashRemoveEntry(xsltExtensionsHash, URI,
- (xmlHashDeallocator) xsltFreeExtModule);
+ xmlMutexLock(xsltExtMutex);
+
+ ret = xmlHashRemoveEntry(xsltExtensionsHash, URI,
+ (xmlHashDeallocator) xsltFreeExtModule);
+
+ xmlMutexUnlock(xsltExtMutex);
+
return (ret);
}
@@ -1302,9 +1344,13 @@
if (xsltExtensionsHash == NULL)
return;
+ xmlMutexLock(xsltExtMutex);
+
xmlHashFree(xsltExtensionsHash,
(xmlHashDeallocator) xsltFreeExtModule);
xsltExtensionsHash = NULL;
+
+ xmlMutexUnlock(xsltExtMutex);
}
/**
@@ -1349,9 +1395,13 @@
if (xsltFunctionsHash == NULL)
return (-1);
+ xmlMutexLock(xsltExtMutex);
+
xmlHashUpdateEntry2(xsltFunctionsHash, name, URI,
XML_CAST_FPTR(function), NULL);
+ xmlMutexUnlock(xsltExtMutex);
+
return (0);
}
@@ -1372,13 +1422,21 @@
if ((xsltFunctionsHash == NULL) || (name == NULL) || (URI == NULL))
return (NULL);
+ xmlMutexLock(xsltExtMutex);
+
XML_CAST_FPTR(ret) = xmlHashLookup2(xsltFunctionsHash, 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(xsltFunctionsHash, name, URI);
+
+ xmlMutexUnlock(xsltExtMutex);
}
}
@@ -1397,10 +1455,18 @@
int
xsltUnregisterExtModuleFunction(const xmlChar * name, const xmlChar * URI)
{
+ int ret;
+
if ((xsltFunctionsHash == NULL) || (name == NULL) || (URI == NULL))
return (-1);
- return xmlHashRemoveEntry2(xsltFunctionsHash, name, URI, NULL);
+ xmlMutexLock(xsltExtMutex);
+
+ ret = xmlHashRemoveEntry2(xsltFunctionsHash, name, URI, NULL);
+
+ xmlMutexUnlock(xsltExtMutex);
+
+ return(ret);
}
/**
@@ -1411,8 +1477,12 @@
static void
xsltUnregisterAllExtModuleFunction(void)
{
+ xmlMutexLock(xsltExtMutex);
+
xmlHashFree(xsltFunctionsHash, NULL);
xsltFunctionsHash = NULL;
+
+ xmlMutexUnlock(xsltExtMutex);
}
@@ -1492,8 +1562,13 @@
(inst->type != XML_ELEMENT_NODE) || (inst->ns == NULL))
return (NULL);
+ xmlMutexLock(xsltExtMutex);
+
ext = (xsltExtElementPtr)
xmlHashLookup2(xsltElementsHash, inst->name, inst->ns->href);
+
+ xmlMutexUnlock(xsltExtMutex);
+
/*
* EXT TODO: Now what?
*/
@@ -1547,6 +1622,8 @@
xsltPreComputeFunction precomp,
xsltTransformFunction transform)
{
+ int ret;
+
xsltExtElementPtr ext;
if ((name == NULL) || (URI == NULL) || (transform == NULL))
@@ -1557,13 +1634,20 @@
if (xsltElementsHash == NULL)
return (-1);
+ xmlMutexLock(xsltExtMutex);
+
ext = xsltNewExtElement(precomp, transform);
- if (ext == NULL)
- return (-1);
+ if (ext == NULL) {
+ ret = -1;
+ goto done;
+ }
xmlHashUpdateEntry2(xsltElementsHash, name, URI, (void *) ext,
(xmlHashDeallocator) xsltFreeExtElement);
+done:
+ xmlMutexUnlock(xsltExtMutex);
+
return (0);
}
@@ -1589,10 +1673,14 @@
if ((ctxt != NULL) && (ctxt->extElements != NULL)) {
XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->extElements, name, URI);
- if (ret != NULL)
- return (ret);
+ if (ret != NULL) {
+ return(ret);
+ }
}
- return xsltExtModuleElementLookup(name, URI);
+
+ ret = xsltExtModuleElementLookup(name, URI);
+
+ return (ret);
}
/**
@@ -1612,14 +1700,24 @@
if ((xsltElementsHash == NULL) || (name == NULL) || (URI == NULL))
return (NULL);
+ xmlMutexLock(xsltExtMutex);
+
ext = (xsltExtElementPtr) xmlHashLookup2(xsltElementsHash, name, URI);
- /* if function lookup fails, attempt a dynamic load on supported platforms */
- 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);
}
}
@@ -1646,12 +1744,20 @@
if ((xsltElementsHash == NULL) || (name == NULL) || (URI == NULL))
return (NULL);
+ xmlMutexLock(xsltExtMutex);
+
ext = (xsltExtElementPtr) xmlHashLookup2(xsltElementsHash, name, URI);
+ xmlMutexUnlock(xsltExtMutex);
+
if (ext == NULL) {
if (!xsltExtModuleRegisterDynamic(URI)) {
+ xmlMutexLock(xsltExtMutex);
+
ext = (xsltExtElementPtr)
xmlHashLookup2(xsltElementsHash, name, URI);
+
+ xmlMutexUnlock(xsltExtMutex);
}
}
@@ -1672,11 +1778,19 @@
int
xsltUnregisterExtModuleElement(const xmlChar * name, const xmlChar * URI)
{
+ int ret;
+
if ((xsltElementsHash == NULL) || (name == NULL) || (URI == NULL))
return (-1);
- return xmlHashRemoveEntry2(xsltElementsHash, name, URI,
- (xmlHashDeallocator) xsltFreeExtElement);
+ xmlMutexLock(xsltExtMutex);
+
+ ret = xmlHashRemoveEntry2(xsltElementsHash, name, URI,
+ (xmlHashDeallocator) xsltFreeExtElement);
+
+ xmlMutexUnlock(xsltExtMutex);
+
+ return(ret);
}
/**
@@ -1687,8 +1801,12 @@
static void
xsltUnregisterAllExtModuleElement(void)
{
+ xmlMutexLock(xsltExtMutex);
+
xmlHashFree(xsltElementsHash, (xmlHashDeallocator) xsltFreeExtElement);
xsltElementsHash = NULL;
+
+ xmlMutexUnlock(xsltExtMutex);
}
/**
@@ -1713,9 +1831,13 @@
if (xsltTopLevelsHash == NULL)
return (-1);
+ xmlMutexLock(xsltExtMutex);
+
xmlHashUpdateEntry2(xsltTopLevelsHash, name, URI,
XML_CAST_FPTR(function), NULL);
+ xmlMutexUnlock(xsltExtMutex);
+
return (0);
}
@@ -1736,12 +1858,20 @@
if ((xsltTopLevelsHash == NULL) || (name == NULL) || (URI == NULL))
return (NULL);
+ xmlMutexLock(xsltExtMutex);
+
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);
}
}
@@ -1760,10 +1890,18 @@
int
xsltUnregisterExtModuleTopLevel(const xmlChar * name, const xmlChar * URI)
{
+ int ret;
+
if ((xsltTopLevelsHash == NULL) || (name == NULL) || (URI == NULL))
return (-1);
- return xmlHashRemoveEntry2(xsltTopLevelsHash, name, URI, NULL);
+ xmlMutexLock(xsltExtMutex);
+
+ ret = xmlHashRemoveEntry2(xsltTopLevelsHash, name, URI, NULL);
+
+ xmlMutexUnlock(xsltExtMutex);
+
+ return(ret);
}
/**
@@ -1774,8 +1912,12 @@
static void
xsltUnregisterAllExtModuleTopLevel(void)
{
+ xmlMutexLock(xsltExtMutex);
+
xmlHashFree(xsltTopLevelsHash, NULL);
xsltTopLevelsHash = NULL;
+
+ xmlMutexUnlock(xsltExtMutex);
}
/**
@@ -2086,6 +2228,7 @@
void
xsltRegisterTestModule(void)
{
+ xsltInitGlobals();
xsltRegisterExtModuleFull((const xmlChar *) XSLT_DEFAULT_URL,
xsltExtInitTest, xsltExtShutdownTest,
xsltExtStyleInitTest,
@@ -2100,7 +2243,8 @@
}
static void
-xsltHashScannerModuleFree(void *payload, void *data ATTRIBUTE_UNUSED,
+xsltHashScannerModuleFree(void *payload ATTRIBUTE_UNUSED,
+ void *data ATTRIBUTE_UNUSED,
xmlChar * name ATTRIBUTE_UNUSED)
{
#ifdef WITH_MODULES
@@ -2109,6 +2253,19 @@
}
/**
+ * xsltInitGlobals:
+ *
+ * Initialize the global variables for extensions
+ */
+void
+xsltInitGlobals(void)
+{
+ if (xsltExtMutex == NULL) {
+ xsltExtMutex = xmlNewMutex();
+ }
+}
+
+/**
* xsltCleanupGlobals:
*
* Unregister all global variables set up by the XSLT library
@@ -2121,13 +2278,17 @@
xsltUnregisterAllExtModuleElement();
xsltUnregisterAllExtModuleTopLevel();
+ xmlMutexLock(xsltExtMutex);
/* cleanup dynamic module hash */
if (NULL != xsltModuleHash) {
xmlHashScan(xsltModuleHash, xsltHashScannerModuleFree, 0);
xmlHashFree(xsltModuleHash, NULL);
xsltModuleHash = NULL;
}
+ xmlMutexUnlock(xsltExtMutex);
+ xmlFreeMutex(xsltExtMutex);
+ xsltExtMutex = NULL;
xsltUninit();
}
@@ -2170,25 +2331,31 @@
fprintf(output, "No registered extension functions\n");
else {
fprintf(output, "Registered Extension Functions:\n");
+ xmlMutexLock(xsltExtMutex);
xmlHashScanFull(xsltFunctionsHash,
(xmlHashScannerFull)
xsltDebugDumpExtensionsCallback, output);
+ xmlMutexUnlock(xsltExtMutex);
}
if (!xsltElementsHash)
fprintf(output, "\nNo registered extension elements\n");
else {
fprintf(output, "\nRegistered Extension Elements:\n");
+ xmlMutexLock(xsltExtMutex);
xmlHashScanFull(xsltElementsHash,
(xmlHashScannerFull)
xsltDebugDumpExtensionsCallback, output);
+ xmlMutexUnlock(xsltExtMutex);
}
if (!xsltExtensionsHash)
fprintf(output, "\nNo registered extension modules\n");
else {
fprintf(output, "\nRegistered Extension Modules:\n");
+ xmlMutexLock(xsltExtMutex);
xmlHashScanFull(xsltExtensionsHash,
(xmlHashScannerFull)
xsltDebugDumpExtModulesCallback, output);
+ xmlMutexUnlock(xsltExtMutex);
}
}
« no previous file with comments | « third_party/libxslt/libxslt/extensions.h ('k') | third_party/libxslt/libxslt/extra.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698