mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-20 16:43:05 +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:
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