mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-102304: Move the Total Refcount to PyInterpreterState (gh-102545)
Moving it valuable with a per-interpreter GIL. However, it is also useful without one, since it allows us to identify refleaks within a single interpreter or where references are escaping an interpreter. This becomes more important as we move the obmalloc state to PyInterpreterState. https://github.com/python/cpython/issues/102304
This commit is contained in:
parent
4bb1dd3c5c
commit
743687434c
13 changed files with 117 additions and 40 deletions
|
@ -317,11 +317,27 @@ _PyType_InitCache(PyInterpreterState *interp)
|
|||
entry->version = 0;
|
||||
// Set to None so _PyType_Lookup() can use Py_SETREF(),
|
||||
// rather than using slower Py_XSETREF().
|
||||
entry->name = Py_NewRef(Py_None);
|
||||
// (See _PyType_FixCacheRefcounts() about the refcount.)
|
||||
entry->name = Py_None;
|
||||
entry->value = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// This is the temporary fix used by pycore_create_interpreter(),
|
||||
// in pylifecycle.c. _PyType_InitCache() is called before the GIL
|
||||
// has been created (for the main interpreter) and without the
|
||||
// "current" thread state set. This causes crashes when the
|
||||
// reftotal is updated, so we don't modify the refcount in
|
||||
// _PyType_InitCache(), and instead do it later by calling
|
||||
// _PyType_FixCacheRefcounts().
|
||||
// XXX This workaround should be removed once we have immortal
|
||||
// objects (PEP 683).
|
||||
void
|
||||
_PyType_FixCacheRefcounts(void)
|
||||
{
|
||||
_Py_RefcntAdd(Py_None, (1 << MCACHE_SIZE_EXP));
|
||||
}
|
||||
|
||||
|
||||
static unsigned int
|
||||
_PyType_ClearCache(PyInterpreterState *interp)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue