summaryrefslogtreecommitdiff
path: root/globals.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2003-05-15 22:11:36 +0000
committerDaniel Veillard <veillard@src.gnome.org>2003-05-15 22:11:36 +0000
commit781ac8b19bfc10635a8bb83158f874116fd7559e (patch)
treed4d835a320b96fd08c5dea232346e63cd20e9fb7 /globals.c
parent6f7e24bb7d94e2163ef26fdad860a3cd06116549 (diff)
downloadlibxml2-781ac8b19bfc10635a8bb83158f874116fd7559e.tar.gz
patch from Stéphane Bidoul for setting up threads global defaults. this
* build_glob.py global.data globals.c parser.c include/libxml/globals.h: patch from Stéphane Bidoul for setting up threads global defaults. * doc/libxml2-api.xml: this extends the API with new functions * python/tests/Makefile.am python/tests/reader2.py python/tests/thread2.py: integrated the associated testcase and fixed the error string used in reader2 Daniel
Diffstat (limited to 'globals.c')
-rw-r--r--globals.c217
1 files changed, 200 insertions, 17 deletions
diff --git a/globals.c b/globals.c
index 0fc54e27..ee6417bc 100644
--- a/globals.c
+++ b/globals.c
@@ -21,6 +21,7 @@
#include <libxml/globals.h>
#include <libxml/xmlmemory.h>
+#include <libxml/threads.h>
/* #define DEBUG_GLOBALS */
@@ -33,6 +34,21 @@
#define IS_MAIN_THREAD 1
#endif
+/*
+ * Mutex to protect "ForNewThreads" variables
+ */
+static xmlMutexPtr xmlThrDefMutex = NULL;
+
+void xmlInitGlobals()
+{
+ xmlThrDefMutex = xmlNewMutex();
+}
+
+void xmlCleanupGlobals()
+{
+ xmlFreeMutex(xmlThrDefMutex);
+}
+
/************************************************************************
* *
* All the user accessible global variables of the library *
@@ -150,12 +166,14 @@ const char *xmlParserVersion = LIBXML_VERSION_STRING;
* XML_BUFFER_ALLOC_EXACT
*/
xmlBufferAllocationScheme xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT;
+static xmlBufferAllocationScheme xmlBufferAllocSchemeThrDef = XML_BUFFER_ALLOC_EXACT;
/**
* xmlDefaultBufferSize:
*
* Global setting, default buffer size. Default value is BASE_BUFFER_SIZE
*/
int xmlDefaultBufferSize = BASE_BUFFER_SIZE;
+static int xmlDefaultBufferSizeThrDef = BASE_BUFFER_SIZE;
/*
* Parser defaults
@@ -175,6 +193,7 @@ int oldXMLWDcompatibility = 0; /* DEPRECATED */
* Disabled by default
*/
int xmlParserDebugEntities = 0;
+static int xmlParserDebugEntitiesThrDef = 0;
/**
* xmlDoValidityCheckingDefaultValue:
*
@@ -182,6 +201,7 @@ int xmlParserDebugEntities = 0;
* Disabled by default.
*/
int xmlDoValidityCheckingDefaultValue = 0;
+static int xmlDoValidityCheckingDefaultValueThrDef = 0;
/**
* xmlGetWarningsDefaultValue:
*
@@ -189,6 +209,7 @@ int xmlDoValidityCheckingDefaultValue = 0;
* Activated by default.
*/
int xmlGetWarningsDefaultValue = 1;
+static int xmlGetWarningsDefaultValueThrDef = 1;
/**
* xmlLoadExtDtdDefaultValue:
*
@@ -197,6 +218,7 @@ int xmlGetWarningsDefaultValue = 1;
* Disabled by default.
*/
int xmlLoadExtDtdDefaultValue = 0;
+static int xmlLoadExtDtdDefaultValueThrDef = 0;
/**
* xmlPedanticParserDefaultValue:
*
@@ -204,6 +226,7 @@ int xmlLoadExtDtdDefaultValue = 0;
* Disabled by default.
*/
int xmlPedanticParserDefaultValue = 0;
+static int xmlPedanticParserDefaultValueThrDef = 0;
/**
* xmlLineNumbersDefaultValue:
*
@@ -213,6 +236,7 @@ int xmlPedanticParserDefaultValue = 0;
* applicaton.
*/
int xmlLineNumbersDefaultValue = 0;
+static int xmlLineNumbersDefaultValueThrDef = 0;
/**
* xmlKeepBlanksDefaultValue:
*
@@ -223,6 +247,7 @@ int xmlLineNumbersDefaultValue = 0;
* for some applications since this was libxml1 default behaviour.
*/
int xmlKeepBlanksDefaultValue = 1;
+static int xmlKeepBlanksDefaultValueThrDef = 1;
/**
* xmlSubstituteEntitiesDefaultValue:
*
@@ -233,9 +258,12 @@ int xmlKeepBlanksDefaultValue = 1;
* engine does not handle entities references transparently.
*/
int xmlSubstituteEntitiesDefaultValue = 0;
+static int xmlSubstituteEntitiesDefaultValueThrDef = 0;
xmlRegisterNodeFunc xmlRegisterNodeDefaultValue = NULL;
+static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL;
xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue = NULL;
+static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL;
/*
* Error handling
@@ -252,12 +280,14 @@ void xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED,
* Global setting: function used for generic error callbacks
*/
xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc;
+static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc;
/**
* xmlGenericErrorContext:
*
* Global setting passed to generic error callbacks
*/
void *xmlGenericErrorContext = NULL;
+static void *xmlGenericErrorContextThrDef = NULL;
/*
* output defaults
@@ -269,6 +299,7 @@ void *xmlGenericErrorContext = NULL;
* Enabled by default
*/
int xmlIndentTreeOutput = 1;
+static int xmlIndentTreeOutputThrDef = 1;
/**
* xmlTreeIndentString:
@@ -276,6 +307,7 @@ int xmlIndentTreeOutput = 1;
* The string used to do one-level indent. By default is equal to " " (two spaces)
*/
const char *xmlTreeIndentString = " ";
+static const char *xmlTreeIndentStringThrDef = " ";
/**
* xmlSaveNoEmptyTags:
@@ -286,6 +318,7 @@ const char *xmlTreeIndentString = " ";
* Disabled by default
*/
int xmlSaveNoEmptyTags = 0;
+int xmlSaveNoEmptyTagsThrDef = 0;
/**
* xmlDefaultSAXHandler:
@@ -427,6 +460,7 @@ xmlInitializeGlobalState(xmlGlobalStatePtr gs)
/*
* Perform initialization as required by libxml
*/
+ xmlMutexLock(xmlThrDefMutex);
#ifdef LIBXML_DOCB_ENABLED
initdocbDefaultSAXHandler(&gs->docbDefaultSAXHandler);
@@ -434,17 +468,17 @@ xmlInitializeGlobalState(xmlGlobalStatePtr gs)
#ifdef LIBXML_HTML_ENABLED
inithtmlDefaultSAXHandler(&gs->htmlDefaultSAXHandler);
#endif
- initGenericErrorDefaultFunc(&gs->xmlGenericError);
gs->oldXMLWDcompatibility = 0;
- gs->xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT;
- gs->xmlDefaultBufferSize = BASE_BUFFER_SIZE;
+ gs->xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef;
+ gs->xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef;
initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1);
gs->xmlDefaultSAXLocator.getPublicId = getPublicId;
gs->xmlDefaultSAXLocator.getSystemId = getSystemId;
gs->xmlDefaultSAXLocator.getLineNumber = getLineNumber;
gs->xmlDefaultSAXLocator.getColumnNumber = getColumnNumber;
- gs->xmlDoValidityCheckingDefaultValue = 0;
+ gs->xmlDoValidityCheckingDefaultValue =
+ xmlDoValidityCheckingDefaultValueThrDef;
#if defined(DEBUG_MEMORY_LOCATION) | defined(DEBUG_MEMORY)
gs->xmlFree = (xmlFreeFunc) xmlMemFree;
gs->xmlMalloc = (xmlMallocFunc) xmlMemMalloc;
@@ -458,21 +492,36 @@ xmlInitializeGlobalState(xmlGlobalStatePtr gs)
gs->xmlRealloc = (xmlReallocFunc) realloc;
gs->xmlMemStrdup = (xmlStrdupFunc) xmlStrdup;
#endif
- gs->xmlGenericErrorContext = NULL;
- gs->xmlGetWarningsDefaultValue = 1;
- gs->xmlIndentTreeOutput = 1;
- gs->xmlTreeIndentString = " ";
- gs->xmlKeepBlanksDefaultValue = 1;
- gs->xmlLineNumbersDefaultValue = 0;
- gs->xmlLoadExtDtdDefaultValue = 0;
- gs->xmlParserDebugEntities = 0;
+ gs->xmlGetWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef;
+ gs->xmlIndentTreeOutput = xmlIndentTreeOutputThrDef;
+ gs->xmlTreeIndentString = xmlTreeIndentStringThrDef;
+ gs->xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef;
+ gs->xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef;
+ gs->xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef;
+ gs->xmlParserDebugEntities = xmlParserDebugEntitiesThrDef;
gs->xmlParserVersion = LIBXML_VERSION_STRING;
- gs->xmlPedanticParserDefaultValue = 0;
- gs->xmlSaveNoEmptyTags = 0;
- gs->xmlSubstituteEntitiesDefaultValue = 0;
+ gs->xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef;
+ gs->xmlSaveNoEmptyTags = xmlSaveNoEmptyTagsThrDef;
+ gs->xmlSubstituteEntitiesDefaultValue =
+ xmlSubstituteEntitiesDefaultValueThrDef;
+
+ gs->xmlGenericError = xmlGenericErrorThrDef;
+ gs->xmlGenericErrorContext = xmlGenericErrorContextThrDef;
+ gs->xmlRegisterNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef;
+ gs->xmlDeregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef;
- gs->xmlRegisterNodeDefaultValue = NULL;
- gs->xmlDeregisterNodeDefaultValue = NULL;
+ xmlMutexUnlock(xmlThrDefMutex);
+}
+
+void
+xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) {
+ xmlMutexLock(xmlThrDefMutex);
+ xmlGenericErrorContextThrDef = ctx;
+ if (handler != NULL)
+ xmlGenericErrorThrDef = handler;
+ else
+ xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc;
+ xmlMutexUnlock(xmlThrDefMutex);
}
/**
@@ -493,6 +542,21 @@ xmlRegisterNodeDefault(xmlRegisterNodeFunc func)
return(old);
}
+xmlRegisterNodeFunc
+xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func)
+{
+ xmlRegisterNodeFunc old;
+
+ xmlMutexLock(xmlThrDefMutex);
+ old = xmlRegisterNodeDefaultValueThrDef;
+
+ __xmlRegisterCallbacks = 1;
+ xmlRegisterNodeDefaultValueThrDef = func;
+ xmlMutexUnlock(xmlThrDefMutex);
+
+ return(old);
+}
+
/**
* xmlDeregisterNodeDefault:
* @func: function pointer to the new DeregisterNodeFunc
@@ -511,6 +575,21 @@ xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func)
return(old);
}
+xmlDeregisterNodeFunc
+xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func)
+{
+ xmlDeregisterNodeFunc old;
+
+ xmlMutexLock(xmlThrDefMutex);
+ old = xmlDeregisterNodeDefaultValueThrDef;
+
+ __xmlRegisterCallbacks = 1;
+ xmlDeregisterNodeDefaultValueThrDef = func;
+ xmlMutexUnlock(xmlThrDefMutex);
+
+ return(old);
+}
+
#ifdef LIBXML_DOCB_ENABLED
#undef docbDefaultSAXHandler
@@ -558,6 +637,14 @@ __xmlBufferAllocScheme(void) {
else
return (&xmlGetGlobalState()->xmlBufferAllocScheme);
}
+xmlBufferAllocationScheme xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v) {
+ xmlBufferAllocationScheme ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlBufferAllocSchemeThrDef;
+ xmlBufferAllocSchemeThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlDefaultBufferSize
int *
@@ -567,6 +654,14 @@ __xmlDefaultBufferSize(void) {
else
return (&xmlGetGlobalState()->xmlDefaultBufferSize);
}
+int xmlThrDefDefaultBufferSize(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlDefaultBufferSizeThrDef;
+ xmlDefaultBufferSizeThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlDefaultSAXHandler
xmlSAXHandler *
@@ -594,6 +689,14 @@ __xmlDoValidityCheckingDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlDoValidityCheckingDefaultValue);
}
+int xmlThrDefDoValidityCheckingDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlDoValidityCheckingDefaultValueThrDef;
+ xmlDoValidityCheckingDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlGenericError
xmlGenericErrorFunc *
@@ -621,6 +724,14 @@ __xmlGetWarningsDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlGetWarningsDefaultValue);
}
+int xmlThrDefGetWarningsDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlGetWarningsDefaultValueThrDef;
+ xmlGetWarningsDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlIndentTreeOutput
int *
@@ -630,6 +741,14 @@ __xmlIndentTreeOutput(void) {
else
return (&xmlGetGlobalState()->xmlIndentTreeOutput);
}
+int xmlThrDefIndentTreeOutput(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlIndentTreeOutputThrDef;
+ xmlIndentTreeOutputThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlTreeIndentString
const char * *
@@ -639,6 +758,14 @@ __xmlTreeIndentString(void) {
else
return (&xmlGetGlobalState()->xmlTreeIndentString);
}
+const char * xmlThrDefTreeIndentString(const char * v) {
+ const char * ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlTreeIndentStringThrDef;
+ xmlTreeIndentStringThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlKeepBlanksDefaultValue
int *
@@ -648,6 +775,14 @@ __xmlKeepBlanksDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlKeepBlanksDefaultValue);
}
+int xmlThrDefKeepBlanksDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlKeepBlanksDefaultValueThrDef;
+ xmlKeepBlanksDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlLineNumbersDefaultValue
int *
@@ -657,6 +792,14 @@ __xmlLineNumbersDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlLineNumbersDefaultValue);
}
+int xmlThrDefLineNumbersDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlLineNumbersDefaultValueThrDef;
+ xmlLineNumbersDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlLoadExtDtdDefaultValue
int *
@@ -666,6 +809,14 @@ __xmlLoadExtDtdDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlLoadExtDtdDefaultValue);
}
+int xmlThrDefLoadExtDtdDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlLoadExtDtdDefaultValueThrDef;
+ xmlLoadExtDtdDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlParserDebugEntities
int *
@@ -675,6 +826,14 @@ __xmlParserDebugEntities(void) {
else
return (&xmlGetGlobalState()->xmlParserDebugEntities);
}
+int xmlThrDefParserDebugEntities(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlParserDebugEntitiesThrDef;
+ xmlParserDebugEntitiesThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlParserVersion
const char * *
@@ -693,6 +852,14 @@ __xmlPedanticParserDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlPedanticParserDefaultValue);
}
+int xmlThrDefPedanticParserDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlPedanticParserDefaultValueThrDef;
+ xmlPedanticParserDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlSaveNoEmptyTags
int *
@@ -702,6 +869,14 @@ __xmlSaveNoEmptyTags(void) {
else
return (&xmlGetGlobalState()->xmlSaveNoEmptyTags);
}
+int xmlThrDefSaveNoEmptyTags(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlSaveNoEmptyTagsThrDef;
+ xmlSaveNoEmptyTagsThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlSubstituteEntitiesDefaultValue
int *
@@ -711,6 +886,14 @@ __xmlSubstituteEntitiesDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultValue);
}
+int xmlThrDefSubstituteEntitiesDefaultValue(int v) {
+ int ret;
+ xmlMutexLock(xmlThrDefMutex);
+ ret = xmlSubstituteEntitiesDefaultValueThrDef;
+ xmlSubstituteEntitiesDefaultValueThrDef = v;
+ xmlMutexUnlock(xmlThrDefMutex);
+ return ret;
+}
#undef xmlRegisterNodeDefaultValue
xmlRegisterNodeFunc *