Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-26558: Fix Py_FatalError() with GIL released #10267

Merged
merged 2 commits into from
Oct 31, 2018
Merged

bpo-26558: Fix Py_FatalError() with GIL released #10267

merged 2 commits into from
Oct 31, 2018

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Oct 31, 2018

Replace PyThreadState_GET() with PyGILState_GetThisThreadState() in
_Py_FatalError_PrintExc().

PyThreadState_GET() must not be called with the GIL released: it
reports the wrong Python thread state.

PyGILState_GetThisThreadState() returns NULL if called from a C
thread which has no Python thread state attached.

https://bugs.python.org/issue26558

Don't call _Py_FatalError_PrintExc() nor flush_std_files() if the
thread doesn't hold the GIL, or if the thread has no Python state
thread.
@vstinner vstinner merged commit 3a228ab into python:master Oct 31, 2018
@miss-islington
Copy link
Contributor

Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.6, 3.7.
🐍🍒⛏🤖

@vstinner vstinner deleted the fatal_error branch October 31, 2018 23:26
miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Oct 31, 2018
Don't call _Py_FatalError_PrintExc() nor flush_std_files() if the
current thread doesn't hold the GIL, or if the current thread
has no Python state thread.
(cherry picked from commit 3a228ab)

Co-authored-by: Victor Stinner <[email protected]>
@bedevere-bot
Copy link

GH-10269 is a backport of this pull request to the 3.7 branch.

@miss-islington
Copy link
Contributor

Sorry, @vstinner, I could not cleanly backport this to 3.6 due to a conflict.
Please backport using cherry_picker on command line.
cherry_picker 3a228ab17c2a9cffd1a2f15f30d6209768de20a6 3.6

@bedevere-bot
Copy link

GH-10270 is a backport of this pull request to the 3.6 branch.

miss-islington added a commit that referenced this pull request Oct 31, 2018
Don't call _Py_FatalError_PrintExc() nor flush_std_files() if the
current thread doesn't hold the GIL, or if the current thread
has no Python state thread.
(cherry picked from commit 3a228ab)

Co-authored-by: Victor Stinner <[email protected]>
vstinner added a commit that referenced this pull request Nov 1, 2018
Don't call _Py_FatalError_PrintExc() nor flush_std_files() if the
current thread doesn't hold the GIL, or if the current thread
has no Python state thread.

(cherry picked from commit 3a228ab)
rwgk pushed a commit to rwgk/pybind11 that referenced this pull request Mar 26, 2021
Possibly, this explains why PyGILState_Check() cannot safely be used with Python 3.4 and 3.5:

python/cpython#10267 (comment)
rwgk pushed a commit to rwgk/pybind11 that referenced this pull request Apr 2, 2021
Possibly, this explains why PyGILState_Check() cannot safely be used with Python 3.4 and 3.5:

python/cpython#10267 (comment)
rwgk pushed a commit to pybind/pybind11 that referenced this pull request Apr 3, 2021
* Adding PyGILState_Check() in object_api<>::operator().

* Enabling PyGILState_Check() for Python >= 3.6 only.

Possibly, this explains why PyGILState_Check() cannot safely be used with Python 3.4 and 3.5:

python/cpython#10267 (comment)

* Adding simple micro benchmark.

* Reducing test time to minimum (purely for coverage, not for accurate results).

* Fixing silly oversight.

* Minor code organization improvement in test.

* Adding example runtimes.

* Removing capsys (just run with `-k test_callback_num_times -s` and using `.format()`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants