summaryrefslogtreecommitdiffstats
path: root/Lib/test/threaded_import_hangers.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2006-04-21 21:18:10 (GMT)
committerTim Peters <tim.peters@gmail.com>2006-04-21 21:18:10 (GMT)
commit21fbd57d66ae9533d53583cbd103cc9976611e5b (patch)
tree9132181cff6ef91af1dce4499a0470e4bdadd521 /Lib/test/threaded_import_hangers.py
parent9f7e58afa71f26513c504697ab0747a88ad43753 (diff)
downloadcpython-21fbd57d66ae9533d53583cbd103cc9976611e5b.zip
cpython-21fbd57d66ae9533d53583cbd103cc9976611e5b.tar.gz
cpython-21fbd57d66ae9533d53583cbd103cc9976611e5b.tar.bz2
SF bug #1473760 TempFile can hang on Windows.
Python 2.4 changed ntpath.abspath to do an import inside the function. As a result, due to Python's import lock, anything calling abspath on Windows (directly, or indirectly like tempfile.TemporaryFile) hung when it was called from a thread spawned as a side effect of importing a module. This is a depressingly frequent problem, and deserves a more general fix. I'm settling for a micro-fix here because this specific one accounts for a report of Zope Corp's ZEO hanging on Windows, and it was an odd way to change abspath to begin with (ntpath needs a different implementation depending on whether we're actually running on Windows, and the _obvious_ way to arrange for that is not to bury a possibly-failing import _inside_ the function). Note that if/when other micro-fixes of this kind get made, the new Lib/test/threaded_import_hangers.py is a convenient place to add tests for them.
Diffstat (limited to 'Lib/test/threaded_import_hangers.py')
-rw-r--r--Lib/test/threaded_import_hangers.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/Lib/test/threaded_import_hangers.py b/Lib/test/threaded_import_hangers.py
new file mode 100644
index 0000000..b21c52f
--- /dev/null
+++ b/Lib/test/threaded_import_hangers.py
@@ -0,0 +1,42 @@
+# 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", tempfile.TemporaryFile, ()),
+
+ # The real cause for bug 147376: ntpath.abspath() caused the hang.
+ ("os.path.abspath", os.path.abspath, ('.',)),
+ ]:
+
+ t = Worker(func, args)
+ t.start()
+ t.join(TIMEOUT)
+ if t.isAlive():
+ errors.append("%s appeared to hang" % name)