1 #!/usr/bin/python -u 2 import string, sys, time 3 try: 4 from _thread import get_ident 5 except: 6 from thread import get_ident 7 from threading import Thread, Lock 8 9 import libxml2 10 11 THREADS_COUNT = 15 12 13 failed = 0 14 15 class ErrorHandler: 16 17 def __init__(self): 18 self.errors = [] 19 self.lock = Lock() 20 21 def handler(self,ctx,str): 22 self.lock.acquire() 23 self.errors.append(str) 24 self.lock.release() 25 26 def getLineNumbersDefault(): 27 old = libxml2.lineNumbersDefault(0) 28 libxml2.lineNumbersDefault(old) 29 return old 30 31 def test(expectedLineNumbersDefault): 32 time.sleep(1) 33 global failed 34 # check a per thread-global 35 if expectedLineNumbersDefault != getLineNumbersDefault(): 36 failed = 1 37 print("FAILED to obtain correct value for " \ 38 "lineNumbersDefault in thread %d" % get_ident()) 39 # check ther global error handler 40 # (which is NOT per-thread in the python bindings) 41 try: 42 doc = libxml2.parseFile("bad.xml") 43 except: 44 pass 45 else: 46 assert "failed" 47 48 # global error handler 49 eh = ErrorHandler() 50 libxml2.registerErrorHandler(eh.handler,"") 51 52 # set on the main thread only 53 libxml2.lineNumbersDefault(1) 54 test(1) 55 ec = len(eh.errors) 56 if ec == 0: 57 print("FAILED: should have obtained errors") 58 sys.exit(1) 59 60 ts = [] 61 for i in range(THREADS_COUNT): 62 # expect 0 for lineNumbersDefault because 63 # the new value has been set on the main thread only 64 ts.append(Thread(target=test,args=(0,))) 65 for t in ts: 66 t.start() 67 for t in ts: 68 t.join() 69 70 if len(eh.errors) != ec+THREADS_COUNT*ec: 71 print("FAILED: did not obtain the correct number of errors") 72 sys.exit(1) 73 74 # set lineNumbersDefault for future new threads 75 libxml2.thrDefLineNumbersDefaultValue(1) 76 ts = [] 77 for i in range(THREADS_COUNT): 78 # expect 1 for lineNumbersDefault 79 ts.append(Thread(target=test,args=(1,))) 80 for t in ts: 81 t.start() 82 for t in ts: 83 t.join() 84 85 if len(eh.errors) != ec+THREADS_COUNT*ec*2: 86 print("FAILED: did not obtain the correct number of errors") 87 sys.exit(1) 88 89 if failed: 90 print("FAILED") 91 sys.exit(1) 92 93 # Memory debug specific 94 libxml2.cleanupParser() 95 if libxml2.debugMemory(1) == 0: 96 print("OK") 97 else: 98 print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 99 libxml2.dumpMemory() 100