1# This is a helper module for test_threaded_import. The test imports this 2# module, and this module tries to run various Python library functions in 3# their own thread, as a side effect of being imported. If the spawned 4# thread doesn't complete in TIMEOUT seconds, an "appeared to hang" message 5# is appended to the module-global `errors` list. That list remains empty 6# if (and only if) all functions tested complete. 7 8TIMEOUT = 10 9 10import threading 11 12import tempfile 13import os.path 14 15errors = [] 16 17# This class merely runs a function in its own thread T. The thread importing 18# this module holds the import lock, so if the function called by T tries 19# to do its own imports it will block waiting for this module's import 20# to complete. 21class Worker(threading.Thread): 22 def __init__(self, function, args): 23 threading.Thread.__init__(self) 24 self.function = function 25 self.args = args 26 27 def run(self): 28 self.function(*self.args) 29 30for name, func, args in [ 31 # Bug 147376: TemporaryFile hung on Windows, starting in Python 2.4. 32 ("tempfile.TemporaryFile", lambda: tempfile.TemporaryFile().close(), ()), 33 34 # The real cause for bug 147376: ntpath.abspath() caused the hang. 35 ("os.path.abspath", os.path.abspath, ('.',)), 36 ]: 37 38 try: 39 t = Worker(func, args) 40 t.start() 41 t.join(TIMEOUT) 42 if t.is_alive(): 43 errors.append("%s appeared to hang" % name) 44 finally: 45 del t 46