-
-
Notifications
You must be signed in to change notification settings - Fork 30.9k
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
Opening a file holds the GIL when it calls "isatty()" #88385
Comments
Opening a file calls GDB:
Please don't do that. In my case, the file in question is implemented as a FUSE mount which is served by the same process (different thread of course). Thus holding the GIL at this point causes a rather interesting deadlock. Tested with 3.9. |
My team ran into this issue while developing a fuse application too. In an effort to help this issue move forward, I tried to list all occurrences of the 9 of them are directly related to stdin/stdout/stderr, so it's probably not crucial to release the GIL for those occurrences:
Out of the remaining 4, only 1 releases the GIL:
Which gives 3 occurrences of non-stdstream specific usage of
The first one is used by The second one is the one found by @smurfix and gets triggered when The third one only triggers on windows when writing more than 32767 bytes to a file descriptor. A comment points to issue bpo-11395 (https://bugs.python.org/issue11395). Also, it seems from the function signature that this function might be called with or without the GIL held, which might cause the fix to be a bit more complicated than the first two use cases. I hope this helps. |
Here's a possible patch that fixes the 3 unprotected calls to |
Please do. However, I do think that changing the stdstream related ioctl calls also is a good idea, if only for code regularity/completeness sake. (Besides, nothing prevents somebody from starting a FUSE file system and then redirecting stdout to it …) |
There are a couple of reasons why I did not make changes to the stdstream related functions. The first one is that a PR with many changes is less likely to get reviewed and merged than a PR with fewer changes. The second one is that it's hard for me to make sure that those functions are always called with the GIL already held. Maybe some of them never hold the GIL in the first place, and I'm not familiar enough with the code base to tell. So in the end it will probably be up to the coredev reviewing the PR, but better start small.
I ran some checks and |
Since the change fixes a deadlock, I agree to backport it to 3.9 and 3.10. Thanks for the fix! |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: