Message14540
PyErr_Warn() does an implicit import. Thus, if
PyErr_Warn() is called on a thread while the main
thread holds the import lock, and the main thread then
subsequently waits for the child thread, Python will
deadlock. The builtin 'apply' now calls PyErr_Warn(),
so simply calling 'apply' on another thread may cause
the deadlock.
Attaching a sample case. Executing 'python -c "import
hang_apply"' will cause Python to deadlock. Commenting
out the call to "apply" in that file will prevent the
deadlock (even though the apply() in question is
effectively a no-op)
The example is a little contrived, but is extracted
from real code of mine that saw this hang. The code
path is:
* Main thread acquires import lock to import the module.
* Module import spawns a new thread. This new thread
calls apply()
* builtin_apply() calls PyErr_Warn
* PyErr_Warn does an import of the warnings module, and
attempts to acquire the import lock.
* Main thread still waiting for child thread to
complete, but still holds import lock.
Note that removing the call to PyErr_Warn() in
builtin_apply also solves this particular hang -
however, it seems like this is a potential time bomb.
A potential solution would be to prevent PyErr_Warn
from doing an import - this would mean importing
'warnings' at startup, and keeping a static reference
in errors.c. Other thoughts welcome.
|
|
Date |
User |
Action |
Args |
2007-08-23 14:10:57 | admin | link | issue683658 messages |
2007-08-23 14:10:57 | admin | create | |
|