mirror of
				https://gitlab.gnome.org/GNOME/libxml2.git
				synced 2025-10-30 10:45:36 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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()
 |