gh-97922: Run the GC only on eval breaker (#97920)
This commit is contained in:
committed by
GitHub
parent
c66dbddfba
commit
83eb827247
@@ -2252,6 +2252,20 @@ PyObject_IS_GC(PyObject *obj)
|
||||
return _PyObject_IS_GC(obj);
|
||||
}
|
||||
|
||||
void
|
||||
_Py_ScheduleGC(PyInterpreterState *interp)
|
||||
{
|
||||
GCState *gcstate = &interp->gc;
|
||||
if (gcstate->collecting == 1) {
|
||||
return;
|
||||
}
|
||||
struct _ceval_state *ceval = &interp->ceval;
|
||||
if (!_Py_atomic_load_relaxed(&ceval->gc_scheduled)) {
|
||||
_Py_atomic_store_relaxed(&ceval->gc_scheduled, 1);
|
||||
_Py_atomic_store_relaxed(&ceval->eval_breaker, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_PyObject_GC_Link(PyObject *op)
|
||||
{
|
||||
@@ -2269,12 +2283,19 @@ _PyObject_GC_Link(PyObject *op)
|
||||
!gcstate->collecting &&
|
||||
!_PyErr_Occurred(tstate))
|
||||
{
|
||||
gcstate->collecting = 1;
|
||||
gc_collect_generations(tstate);
|
||||
gcstate->collecting = 0;
|
||||
_Py_ScheduleGC(tstate->interp);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_Py_RunGC(PyThreadState *tstate)
|
||||
{
|
||||
GCState *gcstate = &tstate->interp->gc;
|
||||
gcstate->collecting = 1;
|
||||
gc_collect_generations(tstate);
|
||||
gcstate->collecting = 0;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
gc_alloc(size_t basicsize, size_t presize)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user