diff options
author | Tim Peters <tim@python.org> | 2013-09-09 23:48:24 (GMT) |
---|---|---|
committer | Tim Peters <tim@python.org> | 2013-09-09 23:48:24 (GMT) |
commit | 72460fa68ba98f5aa94cdc842070884403c0fc73 (patch) | |
tree | c35fa089da52dce5cb1f10c373ce19b9b90e76c8 /Lib | |
parent | b5e9ac9ec63f2d437515edd2cbce31c5774e9dbd (diff) | |
download | cpython-72460fa68ba98f5aa94cdc842070884403c0fc73.zip cpython-72460fa68ba98f5aa94cdc842070884403c0fc73.tar.gz cpython-72460fa68ba98f5aa94cdc842070884403c0fc73.tar.bz2 |
Get "stopped" back into repr(Thread) when appropriate.
Due to recent changes, a Thread doesn't know that it's over before
someone calls .join() or .is_alive(). That meant repr(Thread)
continued to include "started" (and not "stopped") before one of
those methods was called, even if hours passed since the thread
ended.
Repaired that.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_threading.py | 25 | ||||
-rw-r--r-- | Lib/threading.py | 1 |
2 files changed, 26 insertions, 0 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 75ae247..c39d5e2 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -573,6 +573,31 @@ class ThreadTests(BaseTestCase): # And verify the thread disposed of _tstate_lock. self.assertTrue(t._tstate_lock is None) + def test_repr_stopped(self): + # Verify that "stopped" shows up in repr(Thread) appropriately. + started = _thread.allocate_lock() + finish = _thread.allocate_lock() + started.acquire() + finish.acquire() + def f(): + started.release() + finish.acquire() + t = threading.Thread(target=f) + t.start() + started.acquire() + self.assertIn("started", repr(t)) + finish.release() + # "stopped" should appear in the repr in a reasonable amount of time. + # Implementation detail: as of this writing, that's trivially true + # if .join() is called, and almost trivially true if .is_alive() is + # called. The detail we're testing here is that "stopped" shows up + # "all on its own". + LOOKING_FOR = "stopped" + for i in range(500): + if LOOKING_FOR in repr(t): + break + time.sleep(0.01) + self.assertIn(LOOKING_FOR, repr(t)) # we waited at least 5 seconds class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 1ad22a4..26d1018 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -574,6 +574,7 @@ class Thread: status = "initial" if self._started.is_set(): status = "started" + self.is_alive() # easy way to get ._is_stopped set when appropriate if self._is_stopped: status = "stopped" if self._daemonic: |