|  | # This is a helper module for test_threaded_import.  The test imports this | 
|  | # module, and this module tries to run various Python library functions in | 
|  | # their own thread, as a side effect of being imported.  If the spawned | 
|  | # thread doesn't complete in TIMEOUT seconds, an "appeared to hang" message | 
|  | # is appended to the module-global `errors` list.  That list remains empty | 
|  | # if (and only if) all functions tested complete. | 
|  |  | 
|  | TIMEOUT = 10 | 
|  |  | 
|  | import threading | 
|  |  | 
|  | import tempfile | 
|  | import os.path | 
|  |  | 
|  | errors = [] | 
|  |  | 
|  | # This class merely runs a function in its own thread T.  The thread importing | 
|  | # this module holds the import lock, so if the function called by T tries | 
|  | # to do its own imports it will block waiting for this module's import | 
|  | # to complete. | 
|  | class Worker(threading.Thread): | 
|  | def __init__(self, function, args): | 
|  | threading.Thread.__init__(self) | 
|  | self.function = function | 
|  | self.args = args | 
|  |  | 
|  | def run(self): | 
|  | self.function(*self.args) | 
|  |  | 
|  | for name, func, args in [ | 
|  | # Bug 147376:  TemporaryFile hung on Windows, starting in Python 2.4. | 
|  | ("tempfile.TemporaryFile", lambda: tempfile.TemporaryFile().close(), ()), | 
|  |  | 
|  | # The real cause for bug 147376:  ntpath.abspath() caused the hang. | 
|  | ("os.path.abspath", os.path.abspath, ('.',)), | 
|  | ]: | 
|  |  | 
|  | try: | 
|  | t = Worker(func, args) | 
|  | t.start() | 
|  | t.join(TIMEOUT) | 
|  | if t.is_alive(): | 
|  | errors.append("%s appeared to hang" % name) | 
|  | finally: | 
|  | del t |