Description
Feature or enhancement
When importing a single-phase init extension in a subinterpreter, Python will make a shallow copy of the module's dictionary, which can share (non-immortal) objects between interpreters.
This does not work properly in the --disable-gil
build, and we should disable it by raising an ImportError
, at least for now. We can investigate how to support this in the future.
There are currently some unit tests for this case. Those tests pass, but that's mostly because they are simple and small changes to things like the GC will cause them to crash.
The underlying problems are not directly related to the GIL, but rather because the GC and our mimalloc integration in the --disable-gil
build assume that non-immortal objects are isolated by interpreter:
- The GC assumes that all tracked objects reachable via
tp_traverse
are also reachable from the per-interpreter mimalloc heaps. Violating this assumption can cause flags to be set to an inconsistent state. - The mimalloc pool of abandoned segments is per-interpreter. If a non-immortal object outlives its creating interpreter, this can cause use-after-free problems.
Linked PRs
Metadata
Metadata
Assignees
Projects
Status