mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-28 00:21:53 +03:00
patch from Stphane Bidoul for setting up threads global defaults. this
* build_glob.py global.data globals.c parser.c include/libxml/globals.h: patch from Stphane 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
This commit is contained in:
@ -1267,6 +1267,7 @@ libxml_xmlErrorInitialize(void)
|
||||
printf("libxml_xmlErrorInitialize() called\n");
|
||||
#endif
|
||||
xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
|
||||
xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
|
||||
}
|
||||
|
||||
PyObject *
|
||||
@ -1767,7 +1768,7 @@ libxml_xpathCallbacksInitialize(void)
|
||||
printf("libxml_xpathCallbacksInitialized called\n");
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
for (i = 0; i < libxml_xpathCallbacksMax; i++) {
|
||||
libxml_xpathCallbacks[i].ctx = NULL;
|
||||
libxml_xpathCallbacks[i].name = NULL;
|
||||
libxml_xpathCallbacks[i].ns_uri = NULL;
|
||||
@ -2620,6 +2621,8 @@ initlibxml2mod(void)
|
||||
|
||||
if (initialized != 0)
|
||||
return;
|
||||
/* XXX xmlInitParser does much more than this */
|
||||
xmlInitGlobals();
|
||||
xmlRegisterDefaultOutputCallbacks();
|
||||
xmlRegisterDefaultInputCallbacks();
|
||||
m = Py_InitModule((char *) "libxml2mod", libxmlMethods);
|
||||
|
@ -63,6 +63,22 @@ cleanupPredefinedEntities()
|
||||
initializePredefinedEntities()
|
||||
predefinedEntity()
|
||||
|
||||
# functions from module globals
|
||||
cleanupGlobals()
|
||||
initGlobals()
|
||||
thrDefDefaultBufferSize()
|
||||
thrDefDoValidityCheckingDefaultValue()
|
||||
thrDefGetWarningsDefaultValue()
|
||||
thrDefIndentTreeOutput()
|
||||
thrDefKeepBlanksDefaultValue()
|
||||
thrDefLineNumbersDefaultValue()
|
||||
thrDefLoadExtDtdDefaultValue()
|
||||
thrDefParserDebugEntities()
|
||||
thrDefPedanticParserDefaultValue()
|
||||
thrDefSaveNoEmptyTags()
|
||||
thrDefSubstituteEntitiesDefaultValue()
|
||||
thrDefTreeIndentString()
|
||||
|
||||
# functions from module nanoftp
|
||||
nanoFTPCleanup()
|
||||
nanoFTPInit()
|
||||
|
@ -28,7 +28,8 @@ PYTESTS= \
|
||||
reader6.py \
|
||||
ctxterror.py\
|
||||
readererr.py\
|
||||
relaxng.py
|
||||
relaxng.py \
|
||||
thread2.py
|
||||
|
||||
XMLS= \
|
||||
tst.xml \
|
||||
|
@ -14,10 +14,10 @@ libxml2.debugMemory(1)
|
||||
err=""
|
||||
expect="""../../test/valid/rss.xml:172: validity error: Element rss does not carry attribute version
|
||||
</rss>
|
||||
^
|
||||
^
|
||||
../../test/valid/xlink.xml:450: validity error: ID dt-arc already defined
|
||||
<p><termdef id="dt-arc" term="Arc">An <ter
|
||||
^
|
||||
^
|
||||
../../test/valid/xlink.xml:530: validity error: attribute def line 199 references an unknown ID "dt-xlg"
|
||||
|
||||
^
|
||||
|
96
python/tests/thread2.py
Executable file
96
python/tests/thread2.py
Executable file
@ -0,0 +1,96 @@
|
||||
#!/usr/bin/python -u
|
||||
import string, sys, time
|
||||
import thread
|
||||
from threading import Thread, Lock
|
||||
|
||||
import libxml2
|
||||
|
||||
THREADS_COUNT = 15
|
||||
|
||||
failed = 0
|
||||
|
||||
class ErrorHandler:
|
||||
|
||||
def __init__(self):
|
||||
self.errors = []
|
||||
self.lock = Lock()
|
||||
|
||||
def handler(self,ctx,str):
|
||||
self.lock.acquire()
|
||||
self.errors.append(str)
|
||||
self.lock.release()
|
||||
|
||||
def getLineNumbersDefault():
|
||||
old = libxml2.lineNumbersDefault(0)
|
||||
libxml2.lineNumbersDefault(old)
|
||||
return old
|
||||
|
||||
def test(expectedLineNumbersDefault):
|
||||
time.sleep(1)
|
||||
global failed
|
||||
# check a per thread-global
|
||||
if expectedLineNumbersDefault != getLineNumbersDefault():
|
||||
failed = 1
|
||||
print "FAILED to obtain correct value for " \
|
||||
"lineNumbersDefault in thread %d" % thread.get_ident()
|
||||
# check ther global error handler
|
||||
# (which is NOT per-thread in the python bindings)
|
||||
try:
|
||||
doc = libxml2.parseFile("bad.xml")
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
assert "failed"
|
||||
|
||||
# global error handler
|
||||
eh = ErrorHandler()
|
||||
libxml2.registerErrorHandler(eh.handler,"")
|
||||
|
||||
# set on the main thread only
|
||||
libxml2.lineNumbersDefault(1)
|
||||
test(1)
|
||||
ec = len(eh.errors)
|
||||
if ec == 0:
|
||||
print "FAILED: should have obtained errors"
|
||||
sys.exit(1)
|
||||
|
||||
ts = []
|
||||
for i in range(THREADS_COUNT):
|
||||
# expect 0 for lineNumbersDefault because
|
||||
# the new value has been set on the main thread only
|
||||
ts.append(Thread(target=test,args=(0,)))
|
||||
for t in ts:
|
||||
t.start()
|
||||
for t in ts:
|
||||
t.join()
|
||||
|
||||
if len(eh.errors) != ec+THREADS_COUNT*ec:
|
||||
print "FAILED: did not obtain the correct number of errors"
|
||||
sys.exit(1)
|
||||
|
||||
# set lineNumbersDefault for future new threads
|
||||
libxml2.thrDefLineNumbersDefaultValue(1)
|
||||
ts = []
|
||||
for i in range(THREADS_COUNT):
|
||||
# expect 1 for lineNumbersDefault
|
||||
ts.append(Thread(target=test,args=(1,)))
|
||||
for t in ts:
|
||||
t.start()
|
||||
for t in ts:
|
||||
t.join()
|
||||
|
||||
if len(eh.errors) != ec+THREADS_COUNT*ec*2:
|
||||
print "FAILED: did not obtain the correct number of errors"
|
||||
sys.exit(1)
|
||||
|
||||
if failed:
|
||||
print "FAILED"
|
||||
sys.exit(1)
|
||||
|
||||
# Memory debug specific
|
||||
libxml2.cleanupParser()
|
||||
if libxml2.debugMemory(1) == 0:
|
||||
print "OK"
|
||||
else:
|
||||
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
|
||||
libxml2.dumpMemory()
|
Reference in New Issue
Block a user