summaryrefslogtreecommitdiffstats
path: root/Lib/threading.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2005-01-08 07:30:42 (GMT)
committerTim Peters <tim.peters@gmail.com>2005-01-08 07:30:42 (GMT)
commit711906e0c26c010600221da50aa930008b8a9447 (patch)
tree3e5ac91205cbd5f93a7d9efc669ebc3f6d6a1a1c /Lib/threading.py
parent84d548994ea58385e398baf1bf015aa6b258f7bb (diff)
downloadcpython-711906e0c26c010600221da50aa930008b8a9447.zip
cpython-711906e0c26c010600221da50aa930008b8a9447.tar.gz
cpython-711906e0c26c010600221da50aa930008b8a9447.tar.bz2
threading._DummyThread.__init__(): document obscure new code.
test_threading.test_foreign_thread(): new test does a basic check that "foreign" threads can using the threading module, and that they create a _DummyThread instance in at least one use case. This isn't a very good test, since a thread created by thread.start_new_thread() isn't particularly "foreign".
Diffstat (limited to 'Lib/threading.py')
-rw-r--r--Lib/threading.py12
1 files changed, 9 insertions, 3 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index 61c25b6..1aed551 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -358,7 +358,7 @@ def _newname(template="Thread-%d"):
# Active thread administration
_active_limbo_lock = _allocate_lock()
-_active = {}
+_active = {} # maps thread id to Thread object
_limbo = {}
@@ -643,8 +643,9 @@ def _pickSomeNonDaemonThread():
# Dummy thread class to represent threads not started here.
-# These aren't garbage collected when they die,
-# nor can they be waited for.
+# These aren't garbage collected when they die, nor can they be waited for.
+# If they invoke anything in threading.py that calls currentThread(), they
+# leave an entry in the _active dict forever after.
# Their purpose is to return *something* from currentThread().
# They are marked as daemon threads so we won't wait for them
# when we exit (conform previous semantics).
@@ -653,7 +654,12 @@ class _DummyThread(Thread):
def __init__(self):
Thread.__init__(self, name=_newname("Dummy-%d"))
+
+ # Thread.__block consumes an OS-level locking primitive, which
+ # can never be used by a _DummyThread. Since a _DummyThread
+ # instance is immortal, that's bad, so release this resource.
del self._Thread__block
+
self._Thread__started = True
_active_limbo_lock.acquire()
_active[_get_ident()] = self