mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-01-26 10:03:34 +03:00
4762c85668
As per https://peps.python.org/pep-0394/, the python binary can be one of the following options: - Python 2 - Python 3 - Not exist All of the scripts in libxml2 use 'python', which may not exist. As Python 2 reached EOL on the 1st January 2020, it's safe to move the scripts to use python3 explicitly.
100 lines
2.3 KiB
Python
Executable File
100 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
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()
|