[Python-checkins] r78517 - in python/trunk: Lib/test/test_threading.py Lib/threading.py Misc/NEWS
Ezio Melotti
ezio.melotti at gmail.com
Mon Mar 1 02:16:47 CET 2010
Hi,
On 28/02/2010 20.36, gregory.p.smith wrote:
> Author: gregory.p.smith
> Date: Sun Feb 28 19:36:09 2010
> New Revision: 78517
>> Log:
> Issue #7481: When a threading.Thread failed to start it would leave the
> instance stuck in initial state and present in threading.enumerate().
>>> Modified:
> python/trunk/Lib/test/test_threading.py
> python/trunk/Lib/threading.py
> python/trunk/Misc/NEWS
>> Modified: python/trunk/Lib/test/test_threading.py
> ==============================================================================
> --- python/trunk/Lib/test/test_threading.py (original)
> +++ python/trunk/Lib/test/test_threading.py Sun Feb 28 19:36:09 2010
> @@ -249,6 +249,25 @@
> t.join()
> # else the thread is still running, and we have no way to kill it
>> + def test_limbo_cleanup(self):
> + # Issue 7481: Failure to start thread should cleanup the limbo map.
> + def fail_new_thread(*args):
> + raise thread.error()
> + _start_new_thread = threading._start_new_thread
> + threading._start_new_thread = fail_new_thread
> + try:
> + t = threading.Thread(target=lambda: None)
> + try:
> + t.start()
> + assert False
> + except thread.error:
> + self.assertFalse(
> + t in threading._limbo,
> + "Failed to cleanup _limbo map on failure of Thread.start()."
> + )
>This could be rewritten as (should work on 2.6/2.7/3.1/3.2):
t = threading.Thread(target=lambda: None)
self.assertRaises(thread.error, t.start)
self.assertFalse(
t in threading._limbo,
"Failed to cleanup _limbo map on failure of Thread.start()."
)
or:
t = threading.Thread(target=lambda: None)
with self.assertRaises(thread.error):
t.start()
self.assertNotIn(
t, threading._limbo,
"Failed to cleanup _limbo map on failure of Thread.start()."
)
(the assertRaises as a context manager works only on 2.7/3.2, assertNotIn on 2.7/3.1/3.2).
Bare 'assert' should be avoided because they don't work with -O.
If you need to, you can use self.fail() instead.
> + finally:
> + threading._start_new_thread = _start_new_thread
> +
> def test_finalize_runnning_thread(self):
> # Issue 1402: the PyGILState_Ensure / _Release functions may be called
> # very late on python exit: on deallocation of a running thread for
>> Modified: python/trunk/Lib/threading.py
> ==============================================================================
> --- python/trunk/Lib/threading.py (original)
> +++ python/trunk/Lib/threading.py Sun Feb 28 19:36:09 2010
> @@ -469,7 +469,12 @@
> self._note("%s.start(): starting thread", self)
> with _active_limbo_lock:
> _limbo[self] = self
> - _start_new_thread(self.__bootstrap, ())
> + try:
> + _start_new_thread(self.__bootstrap, ())
> + except Exception:
> + with _active_limbo_lock:
> + del _limbo[self]
> + raise
> self.__started.wait()
>> def run(self):
>> Modified: python/trunk/Misc/NEWS
> ==============================================================================
> --- python/trunk/Misc/NEWS (original)
> +++ python/trunk/Misc/NEWS Sun Feb 28 19:36:09 2010
> @@ -72,6 +72,9 @@
>> - Issue #7427: improve the representation of httplib.BadStatusLine exceptions.
>> +- Issue #7481: When a threading.Thread failed to start it would leave the
> + instance stuck in initial state and present in threading.enumerate().
> +
> Extension Modules
> -----------------
>> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>>Best Regards,
Ezio Melotti
More information about the Python-checkins
mailing list