gh-146527: Heap-allocate gc_stats to avoid bloating PyInterpreterStat… · python/cpython@21fb9dc

GitHub

@@ -177,6 +177,11 @@ _PyGC_Init(PyInterpreterState *interp)

177177{

178178GCState*gcstate=&interp->gc;

179179180+gcstate->generation_stats=PyMem_RawCalloc(1, sizeof(structgc_stats));

181+if (gcstate->generation_stats==NULL) {

182+return_PyStatus_NO_MEMORY();

183+ }

184+180185gcstate->garbage=PyList_New(0);

181186if (gcstate->garbage==NULL) {

182187return_PyStatus_NO_MEMORY();

@@ -1398,13 +1403,13 @@ static struct gc_generation_stats *

13981403gc_get_stats(GCState*gcstate, intgen)

13991404{

14001405if (gen==0) {

1401-structgc_young_stats_buffer*buffer=&gcstate->generation_stats.young;

1406+structgc_young_stats_buffer*buffer=&gcstate->generation_stats->young;

14021407buffer->index= (buffer->index+1) % GC_YOUNG_STATS_SIZE;

14031408structgc_generation_stats*stats=&buffer->items[buffer->index];

14041409returnstats;

14051410 }

14061411else {

1407-structgc_old_stats_buffer*buffer=&gcstate->generation_stats.old[gen-1];

1412+structgc_old_stats_buffer*buffer=&gcstate->generation_stats->old[gen-1];

14081413buffer->index= (buffer->index+1) % GC_OLD_STATS_SIZE;

14091414structgc_generation_stats*stats=&buffer->items[buffer->index];

14101415returnstats;

@@ -1415,12 +1420,12 @@ static struct gc_generation_stats *

14151420gc_get_prev_stats(GCState*gcstate, intgen)

14161421{

14171422if (gen==0) {

1418-structgc_young_stats_buffer*buffer=&gcstate->generation_stats.young;

1423+structgc_young_stats_buffer*buffer=&gcstate->generation_stats->young;

14191424structgc_generation_stats*stats=&buffer->items[buffer->index];

14201425returnstats;

14211426 }

14221427else {

1423-structgc_old_stats_buffer*buffer=&gcstate->generation_stats.old[gen-1];

1428+structgc_old_stats_buffer*buffer=&gcstate->generation_stats->old[gen-1];

14241429structgc_generation_stats*stats=&buffer->items[buffer->index];

14251430returnstats;

14261431 }

@@ -2299,6 +2304,8 @@ _PyGC_Fini(PyInterpreterState *interp)

22992304GCState*gcstate=&interp->gc;

23002305Py_CLEAR(gcstate->garbage);

23012306Py_CLEAR(gcstate->callbacks);

2307+PyMem_RawFree(gcstate->generation_stats);

2308+gcstate->generation_stats=NULL;

2302230923032310/* Prevent a subtle bug that affects sub-interpreters that use basic

23042311 * single-phase init extensions (m_size == -1). Those extensions cause objects