#!/usr/bin/python -u 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()