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