bpo-40521: Make context free list per-interpreter (GH-20644)

Each interpreter now has its own context free list:

* Move context free list into PyInterpreterState.
* Add _Py_context_state structure.
* Add tstate parameter to _PyContext_ClearFreeList()
  and _PyContext_Fini().
* Pass tstate to clear_freelists().
This commit is contained in:
Victor Stinner 2020-06-05 02:56:37 +02:00 committed by GitHub
parent 78a02c2568
commit e005ead49b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 34 additions and 28 deletions

View file

@ -1023,16 +1023,15 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate,
* Clearing the free lists may give back memory to the OS earlier.
*/
static void
clear_freelists(void)
clear_freelists(PyThreadState *tstate)
{
PyThreadState *tstate = _PyThreadState_GET();
_PyFrame_ClearFreeList(tstate);
_PyTuple_ClearFreeList(tstate);
_PyFloat_ClearFreeList(tstate);
_PyList_ClearFreeList(tstate);
_PyDict_ClearFreeList();
_PyAsyncGen_ClearFreeLists(tstate);
_PyContext_ClearFreeList();
_PyContext_ClearFreeList(tstate);
}
// Show stats for objects in each generations
@ -1306,7 +1305,7 @@ collect(PyThreadState *tstate, int generation,
/* Clear free list only during the collection of the highest
* generation */
if (generation == NUM_GENERATIONS-1) {
clear_freelists();
clear_freelists(tstate);
}
if (_PyErr_Occurred(tstate)) {