-
-
Notifications
You must be signed in to change notification settings - Fork 34.4k
Immortalize Py_EMPTY_KEYS #104252
Copy link
Copy link
Closed
Labels
3.12only security fixesonly security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-featureA feature request or enhancementA feature request or enhancement
Metadata
Metadata
Assignees
Labels
3.12only security fixesonly security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-featureA feature request or enhancementA feature request or enhancement
The every dict has a keys "object", of type
PyDictKeysObject. While it isn't actually a Python object, it does have a refcount, which is used to know when to free it.PyDictKeysObject(and the helpers,dictkeys_incref()anddictkeys_decref()) was not updated to be immortal when the other singletons were. When it comes to interpreter isolation, that's a problem for empty dicts.Every empty dict shares a global, statically allocated singleton for its keys:
Py_EMPTY_KEYS(AKAstatic PyDictKeysObject empty_keys_struct). This singleton is defined and used internally in dictobject.c, so we don't have the same ABI compatibility concerns that we have with object ref counts generally,One way or another, we need to isolate
Py_EMPTY_KEYS. Otherwise we end up with races on the refcount.cc @eduardo-elizondo @markshannon
Possible solutions:
Py_EMPTY_KEYSimmortalPy_EMPTY_KEYStoPyInterpreterStateThe first one seems simpler.
Linked PRs