Currently there are still a bunch of PyObject static variables in the code that need to become per-interpreter. This includes quite a few static types (e.g. in Objects/*.c), as well as freelists and caches. To make the transition easier I'd like to move all those objects under a single struct.
When I started consolidating globals a few years back, my plan was to turn static variables into fields on the _PyRuntimeState struct, where they can later be moved down into PyInterpreterState and become per-interpreter. That has worked fine but the mental indirection in that process is clunky. Consequently, in practice we've ended up just moving things directly to PyInterpreterState, even in cases where making something per-interpreter is premature.
So at this point I'm planning on a slightly different approach. We'll move the objects (and other state) to PyInterpreterState as pointer fields, and then use the main interpreter's pointers in the corresponding fields in all subinterpreters. Thus it will be equivalent to having a single global state. However, it will go smoother down the road when we make all that state unique to each interpreter.
|