backport of a thread bugfix from 2_5_X branch Daniel
* threads.c: backport of a thread bugfix from 2_5_X branch
Daniel
diff --git a/ChangeLog b/ChangeLog
index ecba195..c756cf0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Sep 12 01:34:19 CEST 2003 Daniel Veillard <daniel@veillard.com>
+
+ * threads.c: backport of a thread bugfix from 2_5_X branch
+
Thu Sep 11 18:29:18 CEST 2003 Daniel Veillard <daniel@veillard.com>
* parser.c: fixed a bug in one corner case of attribute parsing.
diff --git a/python/libxml2class.txt b/python/libxml2class.txt
index 6a77cd1..aa80acc 100644
--- a/python/libxml2class.txt
+++ b/python/libxml2class.txt
@@ -573,41 +573,53 @@
# functions from module xpointer
xpointerNewContext()
-Class xpathContext()
- # accessors
- contextDoc()
- contextNode()
- contextPosition()
- contextSize()
- function()
- functionURI()
- setContextDoc()
- setContextNode()
-
- # functions from module python
- registerXPathFunction()
-
- # functions from module xpath
- xpathEval()
- xpathEvalExpression()
- xpathFreeContext()
-
- # functions from module xpathInternals
- xpathNewParserContext()
- xpathNsLookup()
- xpathRegisterAllFunctions()
- xpathRegisterNs()
- xpathRegisteredFuncsCleanup()
- xpathRegisteredNsCleanup()
- xpathRegisteredVariablesCleanup()
- xpathVariableLookup()
- xpathVariableLookupNS()
-
- # functions from module xpointer
- xpointerEval()
Class xmlAttribute(xmlNode)
+Class xmlTextReaderLocator()
+
+ # functions from module xmlreader
+ BaseURI()
+ LineNumber()
+
+
+Class xmlNs(xmlNode)
+
+ # functions from module tree
+ copyNamespace()
+ copyNamespaceList()
+ freeNs()
+ freeNsList()
+ newChild()
+ newDocNode()
+ newDocNodeEatName()
+ newDocRawNode()
+ newNodeEatName()
+ newNsProp()
+ newNsPropEatName()
+ newTextChild()
+ setNs()
+ setNsProp()
+ unsetNsProp()
+
+ # functions from module xpathInternals
+ xpathNodeSetFreeNs()
+
+
+Class xmlDtd(xmlNode)
+
+ # functions from module debugXML
+ debugDumpDTD()
+
+ # functions from module tree
+ copyDtd()
+ freeDtd()
+
+ # functions from module valid
+ dtdAttrDesc()
+ dtdElementDesc()
+ dtdQAttrDesc()
+ dtdQElementDesc()
Class catalog()
# functions from module catalog
@@ -621,106 +633,6 @@
resolvePublic()
resolveSystem()
resolveURI()
-
-
-Class xmlElement(xmlNode)
-
-
-Class xmlAttr(xmlNode)
-
- # functions from module debugXML
- debugDumpAttr()
- debugDumpAttrList()
-
- # functions from module tree
- copyProp()
- copyPropList()
- freeProp()
- freePropList()
- removeProp()
-
- # functions from module valid
- removeID()
- removeRef()
-
-
-Class xmlTextReader(xmlTextReaderCore)
-
- # functions from module xmlreader
- AttributeCount()
- BaseUri()
- Close()
- CurrentDoc()
- CurrentNode()
- Depth()
- Expand()
- GetAttribute()
- GetAttributeNo()
- GetAttributeNs()
- GetParserProp()
- GetRemainder()
- HasAttributes()
- HasValue()
- IsDefault()
- IsEmptyElement()
- IsValid()
- LocalName()
- LookupNamespace()
- MoveToAttribute()
- MoveToAttributeNo()
- MoveToAttributeNs()
- MoveToElement()
- MoveToFirstAttribute()
- MoveToNextAttribute()
- Name()
- NamespaceUri()
- Next()
- NodeType()
- Normalization()
- Prefix()
- QuoteChar()
- Read()
- ReadAttributeValue()
- ReadInnerXml()
- ReadOuterXml()
- ReadState()
- ReadString()
- RelaxNGSetSchema()
- RelaxNGValidate()
- SetParserProp()
- Value()
- XmlLang()
-Class xmlReg()
-
- # functions from module xmlregexp
- regexpExec()
- regexpFreeRegexp()
- regexpIsDeterminist()
- regexpPrint()
-
-
-Class xmlEntity(xmlNode)
-
- # functions from module parserInternals
- handleEntity()
-Class relaxNgSchema()
-
- # functions from module relaxng
- relaxNGDump()
- relaxNGDumpTree()
- relaxNGFree()
- relaxNGNewValidCtxt()
-
- # functions from module xmlreader
- RelaxNGSetSchema()
-Class relaxNgValidCtxt()
-
- # functions from module relaxng
- relaxNGValidateDoc()
- relaxNGValidateFullElement()
- relaxNGValidatePopElement()
- relaxNGValidatePushCData()
- relaxNGValidatePushElement()
Class xpathParserContext()
# accessors
context()
@@ -866,62 +778,6 @@
stringLenDecodeEntities()
-Class xmlDtd(xmlNode)
-
- # functions from module debugXML
- debugDumpDTD()
-
- # functions from module tree
- copyDtd()
- freeDtd()
-
- # functions from module valid
- dtdAttrDesc()
- dtdElementDesc()
- dtdQAttrDesc()
- dtdQElementDesc()
-
-
-Class xmlNs(xmlNode)
-
- # functions from module tree
- copyNamespace()
- copyNamespaceList()
- freeNs()
- freeNsList()
- newChild()
- newDocNode()
- newDocNodeEatName()
- newDocRawNode()
- newNodeEatName()
- newNsProp()
- newNsPropEatName()
- newTextChild()
- setNs()
- setNsProp()
- unsetNsProp()
-
- # functions from module xpathInternals
- xpathNodeSetFreeNs()
-
-
-Class inputBuffer(ioReadWrapper)
-
- # functions from module xmlIO
- freeParserInputBuffer()
- grow()
- push()
- read()
-
- # functions from module xmlreader
- newTextReader()
-Class relaxNgParserCtxt()
-
- # functions from module relaxng
- relaxNGFreeParserCtxt()
- relaxNGParse()
-
-
Class outputBuffer(ioWriteWrapper)
# functions from module HTMLtree
@@ -940,11 +796,98 @@
flush()
write()
writeString()
-Class xmlTextReaderLocator()
+
+
+Class xmlElement(xmlNode)
+Class relaxNgSchema()
+
+ # functions from module relaxng
+ relaxNGDump()
+ relaxNGDumpTree()
+ relaxNGFree()
+ relaxNGNewValidCtxt()
# functions from module xmlreader
- BaseURI()
- LineNumber()
+ RelaxNGSetSchema()
+
+
+Class xmlEntity(xmlNode)
+
+ # functions from module parserInternals
+ handleEntity()
+
+
+Class xmlTextReader(xmlTextReaderCore)
+
+ # functions from module xmlreader
+ AttributeCount()
+ BaseUri()
+ Close()
+ CurrentDoc()
+ CurrentNode()
+ Depth()
+ Expand()
+ GetAttribute()
+ GetAttributeNo()
+ GetAttributeNs()
+ GetParserProp()
+ GetRemainder()
+ HasAttributes()
+ HasValue()
+ IsDefault()
+ IsEmptyElement()
+ IsValid()
+ LocalName()
+ LookupNamespace()
+ MoveToAttribute()
+ MoveToAttributeNo()
+ MoveToAttributeNs()
+ MoveToElement()
+ MoveToFirstAttribute()
+ MoveToNextAttribute()
+ Name()
+ NamespaceUri()
+ Next()
+ NodeType()
+ Normalization()
+ Prefix()
+ QuoteChar()
+ Read()
+ ReadAttributeValue()
+ ReadInnerXml()
+ ReadOuterXml()
+ ReadState()
+ ReadString()
+ RelaxNGSetSchema()
+ RelaxNGValidate()
+ SetParserProp()
+ Value()
+ XmlLang()
+
+
+Class xmlAttr(xmlNode)
+
+ # functions from module debugXML
+ debugDumpAttr()
+ debugDumpAttrList()
+
+ # functions from module tree
+ copyProp()
+ copyPropList()
+ freeProp()
+ freePropList()
+ removeProp()
+
+ # functions from module valid
+ removeID()
+ removeRef()
+Class xmlReg()
+
+ # functions from module xmlregexp
+ regexpExec()
+ regexpFreeRegexp()
+ regexpIsDeterminist()
+ regexpPrint()
Class URI()
# accessors
authority()
@@ -971,3 +914,60 @@
parseURIReference()
printURI()
saveUri()
+Class relaxNgParserCtxt()
+
+ # functions from module relaxng
+ relaxNGFreeParserCtxt()
+ relaxNGParse()
+Class xpathContext()
+ # accessors
+ contextDoc()
+ contextNode()
+ contextPosition()
+ contextSize()
+ function()
+ functionURI()
+ setContextDoc()
+ setContextNode()
+
+ # functions from module python
+ registerXPathFunction()
+
+ # functions from module xpath
+ xpathEval()
+ xpathEvalExpression()
+ xpathFreeContext()
+
+ # functions from module xpathInternals
+ xpathNewParserContext()
+ xpathNsLookup()
+ xpathRegisterAllFunctions()
+ xpathRegisterNs()
+ xpathRegisteredFuncsCleanup()
+ xpathRegisteredNsCleanup()
+ xpathRegisteredVariablesCleanup()
+ xpathVariableLookup()
+ xpathVariableLookupNS()
+
+ # functions from module xpointer
+ xpointerEval()
+
+
+Class inputBuffer(ioReadWrapper)
+
+ # functions from module xmlIO
+ freeParserInputBuffer()
+ grow()
+ push()
+ read()
+
+ # functions from module xmlreader
+ newTextReader()
+Class relaxNgValidCtxt()
+
+ # functions from module relaxng
+ relaxNGValidateDoc()
+ relaxNGValidateFullElement()
+ relaxNGValidatePopElement()
+ relaxNGValidatePushCData()
+ relaxNGValidatePushElement()
diff --git a/threads.c b/threads.c
index fd03e66..c646449 100644
--- a/threads.c
+++ b/threads.c
@@ -235,8 +235,10 @@
* xmlRMutexLock() is used to lock a libxml2 token_r.
*/
void
-xmlRMutexLock(xmlRMutexPtr tok ATTRIBUTE_UNUSED)
+xmlRMutexLock(xmlRMutexPtr tok)
{
+ if (tok == NULL)
+ return;
#ifdef HAVE_PTHREAD_H
pthread_mutex_lock(&tok->lock);
if (tok->held) {
@@ -269,6 +271,8 @@
void
xmlRMutexUnlock(xmlRMutexPtr tok ATTRIBUTE_UNUSED)
{
+ if (tok == NULL)
+ return;
#ifdef HAVE_PTHREAD_H
pthread_mutex_lock(&tok->lock);
tok->held--;