Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Include/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -728,7 +728,6 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void);
/* Py_REF_DEBUG also controls the display of refcounts and memory block
* allocations at the interactive prompt and at interpreter shutdown
*/
PyAPI_FUNC(PyObject *) _PyDebug_XOptionShowRefCount(void);
PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void);
#else
#define _Py_INC_REFTOTAL
Expand Down
20 changes: 12 additions & 8 deletions Include/pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,17 @@ typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int);


typedef struct {
int ignore_environment;
int use_hash_seed;
int ignore_environment; /* -E */
int use_hash_seed; /* PYTHONHASHSEED=x */
unsigned long hash_seed;
int _disable_importlib; /* Needed by freeze_importlib */
char *allocator;
int faulthandler;
int tracemalloc; /* Number of saved frames, 0=don't trace */
int importtime; /* -X importtime */
const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */
int dev_mode; /* -X dev */
int faulthandler; /* -X faulthandler */
int tracemalloc; /* -X tracemalloc=N */
int import_time; /* -X importtime */
int show_ref_count; /* -X showrefcount */
int show_alloc_count; /* -X showalloccount */
} _PyCoreConfig;

#define _PyCoreConfig_INIT \
Expand All @@ -42,10 +44,12 @@ typedef struct {
.hash_seed = 0, \
._disable_importlib = 0, \
.allocator = NULL, \
.dev_mode = 0, \
.faulthandler = 0, \
.tracemalloc = 0, \
.importtime = 0, \
.dev_mode = 0}
.import_time = 0, \
.show_ref_count = 0, \
.show_alloc_count = 0}

/* Placeholders while working on the new configuration API
*
Expand Down
10 changes: 9 additions & 1 deletion Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1384,14 +1384,22 @@ pymain_parse_envvars(_PyMain *pymain)
}
core_config->allocator = Py_GETENV("PYTHONMALLOC");

/* -X options */
if (pymain_get_xoption(pymain, L"showrefcount")) {
core_config->show_ref_count = 1;
}
if (pymain_get_xoption(pymain, L"showalloccount")) {
core_config->show_alloc_count = 1;
}

/* More complex options: env var and/or -X option */
if (pymain_get_env_var("PYTHONFAULTHANDLER")
|| pymain_get_xoption(pymain, L"faulthandler")) {
core_config->faulthandler = 1;
}
if (pymain_get_env_var("PYTHONPROFILEIMPORTTIME")
|| pymain_get_xoption(pymain, L"importtime")) {
core_config->importtime = 1;
core_config->import_time = 1;
}
if (pymain_init_tracemalloc(pymain) < 0) {
return -1;
Expand Down
11 changes: 3 additions & 8 deletions Objects/listobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,10 @@ static size_t count_reuse = 0;
static void
show_alloc(void)
{
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);

xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
PyInterpreterState *interp = PyThreadState_GET()->interp;
if (!inter->core_config.show_alloc_count) {
return;
}

fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
count_alloc);
Expand Down
23 changes: 3 additions & 20 deletions Objects/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,6 @@ _Py_GetRefTotal(void)
return total;
}

PyObject *
_PyDebug_XOptionShowRefCount(void)
{
PyObject *xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return NULL;

_Py_IDENTIFIER(showrefcount);
return _PyDict_GetItemId(xoptions, &PyId_showrefcount);
}

void
_PyDebug_PrintTotalRefs(void) {
fprintf(stderr,
Expand Down Expand Up @@ -106,16 +95,10 @@ extern Py_ssize_t null_strings, one_strings;
void
dump_counts(FILE* f)
{
PyTypeObject *tp;
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);

xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
PyInterpreterState *interp = PyThreadState_GET()->interp;
if (!inter->core_config.show_alloc_count) {
return;
}

for (tp = type_list; tp; tp = tp->tp_next)
fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "
Expand Down
11 changes: 3 additions & 8 deletions Objects/tupleobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,10 @@ static Py_ssize_t count_tracked = 0;
static void
show_track(void)
{
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);

xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
PyInterpreterState *interp = PyThreadState_GET()->interp;
if (!inter->core_config.show_alloc_count) {
return;
}

fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
count_tracked + count_untracked);
Expand Down
7 changes: 3 additions & 4 deletions Python/import.c
Original file line number Diff line number Diff line change
Expand Up @@ -1674,8 +1674,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
}
}
else {
/* 1 -- true, 0 -- false, -1 -- not initialized */
int importtime = interp->core_config.importtime;
int import_time = interp->core_config.import_time;
static int import_level;
static _PyTime_t accumulated;

Expand All @@ -1686,7 +1685,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
* Anyway, importlib._find_and_load is much slower than
* _PyDict_GetItemIdWithError().
*/
if (importtime) {
if (import_time) {
static int header = 1;
if (header) {
fputs("import time: self [us] | cumulative | imported package\n",
Expand All @@ -1712,7 +1711,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
mod != NULL);

if (importtime) {
if (import_time) {
_PyTime_t cum = _PyTime_GetPerfCounter() - t1;

import_level--;
Expand Down
9 changes: 3 additions & 6 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -1101,10 +1101,6 @@ Py_FinalizeEx(void)
/* nothing */;
#endif

#ifdef Py_REF_DEBUG
PyObject *showrefcount = _PyDebug_XOptionShowRefCount();
#endif

/* Destroy all modules */
PyImport_Cleanup();

Expand Down Expand Up @@ -1153,8 +1149,9 @@ Py_FinalizeEx(void)
_PyHash_Fini();

#ifdef Py_REF_DEBUG
if (showrefcount == Py_True)
_PyDebug_PrintTotalRefs();
if (interp->core_config.show_ref_count) {
_PyDebug_PrintTotalRefs();
}
#endif

#ifdef Py_TRACE_REFS
Expand Down
6 changes: 5 additions & 1 deletion Python/pythonrun.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *
int ret, err;
PyCompilerFlags local_flags;
int nomem_count = 0;
#ifdef Py_REF_DEBUG
int show_ref_count = PyThreadState_GET()->interp->core_config.show_ref_count;
#endif

filename = PyUnicode_DecodeFSDefault(filename_str);
if (filename == NULL) {
Expand Down Expand Up @@ -134,8 +137,9 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *
nomem_count = 0;
}
#ifdef Py_REF_DEBUG
if (_PyDebug_XOptionShowRefCount() == Py_True)
if (show_ref_count) {
_PyDebug_PrintTotalRefs();
}
#endif
} while (ret != E_EOF);
Py_DECREF(filename);
Expand Down