mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-04-25 22:50:08 +03:00
* In conda or Gentoo Prefix, we don't want to use the system python and instead rely on PATH lookup.
100 lines
2.3 KiB
Python
Executable File
100 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import string, sys, time
|
|
try:
|
|
from _thread import get_ident
|
|
except:
|
|
from thread import get_ident
|
|
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" % 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()
|