-
-
Notifications
You must be signed in to change notification settings - Fork 31.5k
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
SIGSEGV with generators in free-threaded build #120321
Comments
Thanks for the repro. Looking into this. |
Confirmed, with pydebug and tsan. |
May I take a chance to dive into this issue? |
@Zheaoli sorry I assigned myself on this one I have a fix already and will put it up shortly. Do you have any specific issues in mind you would like to work on? I could help mentor/guide you on stuff you're interested in if I can help! |
No problem!
For now, I'm a fresh man try to be more familiar with the CPython codebase. I'm now working on #104280 to make dtrace more functional to help debug the process. I'm also interested in JIT and Tier2(especially to enhance the observerability for the Python process). But I'm still trying to find the issue I can fix and the thing I can do(lol Thanks for knowing that you will be willing to mentor/guide me lol! |
@Zheaoli please send me an email I'll help give some pointers privately |
In the free threading build, use atomics to change the generator s state. Generators can only be executed by one thread at a time and it's an error to try to iterate over or send a value into a currently executing generator. The `gen_send_ex2` function needs to determine if the `_PyEval_EvalFrame()` call resulted in the generator suspended or returned. We can't rely on `gi_frame_state` because if the generator suspended, a different thread could have (in theory) immediately started executing it. Instead, route the resulting frame state through a new `gi_out_frame_state` pointer.
In the free threading build, use atomics to change the generator s state. Generators can only be executed by one thread at a time and it's an error to try to iterate over or send a value into a currently executing generator. The `gen_send_ex2` function needs to determine if the `_PyEval_EvalFrame()` call resulted in the generator suspended or returned. We can't rely on `gi_frame_state` because if the generator suspended, a different thread could have (in theory) immediately started executing it. Instead, route the resulting frame state through a new `gi_out_frame_state` pointer.
In the free threading build, use atomics to change the generator s state. Generators can only be executed by one thread at a time and it's an error to try to iterate over or send a value into a currently executing generator. The `gen_send_ex2` function needs to determine if the `_PyEval_EvalFrame()` call resulted in the generator suspended or returned. We can't rely on `gi_frame_state` because if the generator suspended, a different thread could have (in theory) immediately started executing it. Instead, route the resulting frame state through a new `gi_out_frame_state` pointer.
Crash report
What happened?
Trying to iterate on a generator from multiple threads under the free-threaded build results in a segmentation fault.
Here is a minimal repro:
The issue seems to be specific to generators as other kinds of iterators work well in parallel.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Output from running 'python -VV' on the command line:
Python 3.14.0a0 experimental free-threading build (heads/main:c3b6dbff2c, Jun 10 2024, 16:54:16) [GCC 11.4.0]
Linked PRs
The text was updated successfully, but these errors were encountered: