-
Notifications
You must be signed in to change notification settings - Fork 793
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
hang instead of pthread_exit during interpreter shutdown #4874
base: main
Are you sure you want to change the base?
Conversation
CodSpeed Performance ReportMerging #4874 will not alter performanceComparing Summary
|
80f138a
to
704ef0b
Compare
Yay it passes tests. |
pyo3-ffi/src/pystate.rs
Outdated
#[cfg(not(Py_3_14))] | ||
pub unsafe extern "C" fn PyGILState_Ensure() -> PyGILState_STATE { | ||
let guard = HangThread; | ||
let ret: PyGILState_STATE = raw::PyGILState_Ensure(); | ||
std::mem::forget(guard); | ||
ret | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Disclaimer: I'm really no expert here.
According to my understanding of the C-unwind
this is still UB. Specifically here is mentioned that forced unwinding (like pthread_exit
) can not rely on Drop
and thus crossing such framed is considered UB.
Given that this was UB before as well, but this one works, maybe that's better 🤷 (We really need a Python API to do this properly)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So bjorn claimed this way is unspecified behavior but should work. I think it's better then the C++ version.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, I think that makes sense to me. I guess we aren't guaranteed that drop
will run, but in case it is not run, we are in the same situation as currently (presumably a crash). So given this (currently) works in practice it seems like a net win to me.
I think it's better then the C++ version.
Definitely agree here, I was not really a fan of adding a C++ toolchain dependency 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added a comment
pytests/tests/test_othermod.py
Outdated
@@ -3,7 +3,7 @@ | |||
|
|||
from pyo3_pytests import othermod | |||
|
|||
INTEGER32_ST = st.integers(min_value=(-(2**31)), max_value=(2**31 - 1)) | |||
INTEGER32_ST = st.integers(min_value=(-(2**30)), max_value=(2**30 - 1)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this change here is to avoid the test failing due to a high rate of assume
failure (filter_too_much
).
split the test_double fix to #4879 |
This mimics the Python 3.14 behavior and avoids crashes in Rust 1.84.
See python/cpython#87135 and rust-lang/rust#135929 and the related pyo3-log issue vorner/pyo3-log#30
By submitting these contributions you agree for them to be dual-licensed under PyO3's MIT OR Apache-2.0 license.