Skip to content

bpo-40521: Make bytes singletons per interpreter #21074

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

Merged
merged 1 commit into from
Jun 23, 2020
Merged

bpo-40521: Make bytes singletons per interpreter #21074

merged 1 commit into from
Jun 23, 2020

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Jun 23, 2020

Each interpreter now has its own empty bytes string and single byte
character singletons.

Replace STRINGLIB_EMPTY macro with STRINGLIB_GET_EMPTY() macro.

https://bugs.python.org/issue40521

Each interpreter now has its own empty bytes string and single byte
character singletons.

Replace STRINGLIB_EMPTY macro with STRINGLIB_GET_EMPTY() macro.
@vstinner vstinner merged commit c41eed1 into python:master Jun 23, 2020
@vstinner vstinner deleted the bytes_interp branch June 23, 2020 13:55
fasih pushed a commit to fasih/cpython that referenced this pull request Jun 29, 2020
Each interpreter now has its own empty bytes string and single byte
character singletons.

Replace STRINGLIB_EMPTY macro with STRINGLIB_GET_EMPTY() macro.
arun-mani-j pushed a commit to arun-mani-j/cpython that referenced this pull request Jul 21, 2020
Each interpreter now has its own empty bytes string and single byte
character singletons.

Replace STRINGLIB_EMPTY macro with STRINGLIB_GET_EMPTY() macro.
@rdb
Copy link

rdb commented Sep 12, 2020

Hi @vstinner, this change introduced a segfault for us since it uses the private _PyInterpreterState_GET (which does no error checking) and then assumes, without asserting, that it's non-NULL.

It seems that, with this change, PyBytes_FromStringAndSize is no longer safe to call when the GIL is not held. Is that by design?

If it's by design, perhaps it would be useful to either use PyInterpreterState_Get or add in an assertion in order to catch this incorrect usage?

rdb added a commit to panda3d/panda3d that referenced this pull request Sep 12, 2020
This is due to python/cpython#21074, which causes a segfault in the latest Python master when creating a bytes object of size 0.

readlines() has been reimplemented to use a C++ vector in order to prevent constantly re-locking and unlocking the GIL for every line.
@vstinner
Copy link
Member Author

Hi @vstinner, this change introduced a segfault for us (...)

Please open a new issue at https://bugs.python.org/ with all details.

But I expect that you misuse the Python C API:

It seems that, with this change, PyBytes_FromStringAndSize is no longer safe to call when the GIL is not held. Is that by design?

You must always hold the GIL to call any function of the Python C API. There are very few exceptions at this rule, and usually these exceptions mention that they can be called without holding the GIL, in their documentation.

It's not a new requirement of Python 3.10, it's just that previous magically, it worked in some cases when the GIL was not held.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants