14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# This is a helper module for test_threaded_import. The test imports this 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# module, and this module tries to run various Python library functions in 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# their own thread, as a side effect of being imported. If the spawned 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# thread doesn't complete in TIMEOUT seconds, an "appeared to hang" message 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# is appended to the module-global `errors` list. That list remains empty 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if (and only if) all functions tested complete. 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTIMEOUT = 10 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport threading 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tempfile 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os.path 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmerrors = [] 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# This class merely runs a function in its own thread T. The thread importing 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# this module holds the import lock, so if the function called by T tries 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# to do its own imports it will block waiting for this module's import 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# to complete. 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Worker(threading.Thread): 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, function, args): 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm threading.Thread.__init__(self) 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.function = function 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.args = args 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def run(self): 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.function(*self.args) 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor name, func, args in [ 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Bug 147376: TemporaryFile hung on Windows, starting in Python 2.4. 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ("tempfile.TemporaryFile", tempfile.TemporaryFile, ()), 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The real cause for bug 147376: ntpath.abspath() caused the hang. 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ("os.path.abspath", os.path.abspath, ('.',)), 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ]: 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = Worker(func, args) 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t.start() 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t.join(TIMEOUT) 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t.is_alive(): 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errors.append("%s appeared to hang" % name) 43