1
0
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:
Daniel Veillard
2003-05-15 22:11:36 +00:00
parent 6f7e24bb7d
commit 781ac8b19b
12 changed files with 511 additions and 57 deletions

View File

@ -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);

View File

@ -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()

View File

@ -28,7 +28,8 @@ PYTESTS= \
reader6.py \
ctxterror.py\
readererr.py\
relaxng.py
relaxng.py \
thread2.py
XMLS= \
tst.xml \

View File

@ -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
View 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()