New submission from Antoine Pitrou <pit...@free.fr>:

test_finalize_with_trace (in test_threading) sometimes fails because of failing 
to destroy the GIL (in _PyEval_FiniThreads()). This can be reproduced quite 
reliably by launching several copies in parallel:

$ ./python -m test.regrtest -j10 -F test_threading
[...]
test test_threading failed -- Traceback (most recent call last):
  File "/home/antoine/py3k/__svn__/Lib/test/test_threading.py", line 334, in 
test_finalize_with_trace
    "Unexpected error: " + ascii(stderr))
AssertionError: Unexpected error: b'Fatal Python error: 
pthread_mutex_destroy(gil_mutex) failed\n'


What happens is that pthread_mutex_destroy() fails with EBUSY. According to the 
POSIX man page:

“[EBUSY]
    The implementation has detected an attempt to destroy the object referenced 
by mutex while it is locked or referenced (for example, while being used in a 
pthread_cond_timedwait() or pthread_cond_wait()) by another thread.”


After a bit of tracing, it becomes clear that Py_Finalize() calls 
_PyEval_FiniThreads() while another thread is taking the GIL (take_gil()). 
Unfortunately, this is not a situation we can avoid, since we rely on process 
exit to kill lingering threads: arbitrary CPython code may still be running in 
parallel while we are finalizing interpreter structures.

Therefore, it is likely that _PyEval_FiniThreads() should avoid destroying the 
mutex at all. Indeed, if we destroy the mutex, it is possible that a lingering 
thread tries to retake the GIL after waking up from a system call 
(Py_END_ALLOW_THREADS), and fails because of another fatal error ("Fatal Python 
error: pthread_mutex_lock(gil_mutex) failed").

----------
components: Interpreter Core
messages: 116893
nosy: amaury.forgeotdarc, pitrou
priority: normal
severity: normal
stage: needs patch
status: open
title: GIL destruction can fail
type: behavior
versions: Python 3.2

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue9901>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to