diff options
author | Mark Shannon <mark@hotpy.org> | 2022-06-21 14:40:54 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-21 14:40:54 (GMT) |
commit | 6f8875eba38b08c802905635759b5f905e3a415c (patch) | |
tree | 6ee112e6f2e61ccbde70f9bf4bc5f103c0e12508 /Include | |
parent | c7a79bb036b42f96b7379b95efa643ee27df2168 (diff) | |
download | cpython-6f8875eba38b08c802905635759b5f905e3a415c.zip cpython-6f8875eba38b08c802905635759b5f905e3a415c.tar.gz cpython-6f8875eba38b08c802905635759b5f905e3a415c.tar.bz2 |
GH-93841: Allow stats to be turned on and off, cleared and dumped at runtime. (GH-93843)
Diffstat (limited to 'Include')
-rw-r--r-- | Include/internal/pycore_code.h | 16 | ||||
-rw-r--r-- | Include/pystats.h | 13 |
2 files changed, 16 insertions, 13 deletions
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 71dd3b3..c975f1c 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -259,16 +259,16 @@ extern int _PyStaticCode_InternStrings(PyCodeObject *co); #ifdef Py_STATS -#define STAT_INC(opname, name) _py_stats.opcode_stats[(opname)].specialization.name++ -#define STAT_DEC(opname, name) _py_stats.opcode_stats[(opname)].specialization.name-- -#define OPCODE_EXE_INC(opname) _py_stats.opcode_stats[(opname)].execution_count++ -#define CALL_STAT_INC(name) _py_stats.call_stats.name++ -#define OBJECT_STAT_INC(name) _py_stats.object_stats.name++ +#define STAT_INC(opname, name) do { if (_py_stats) _py_stats->opcode_stats[opname].specialization.name++; } while (0) +#define STAT_DEC(opname, name) do { if (_py_stats) _py_stats->opcode_stats[opname].specialization.name--; } while (0) +#define OPCODE_EXE_INC(opname) do { if (_py_stats) _py_stats->opcode_stats[opname].execution_count++; } while (0) +#define CALL_STAT_INC(name) do { if (_py_stats) _py_stats->call_stats.name++; } while (0) +#define OBJECT_STAT_INC(name) do { if (_py_stats) _py_stats->object_stats.name++; } while (0) #define OBJECT_STAT_INC_COND(name, cond) \ - do { if (cond) _py_stats.object_stats.name++; } while (0) -#define EVAL_CALL_STAT_INC(name) _py_stats.call_stats.eval_calls[(name)]++ + do { if (_py_stats && cond) _py_stats->object_stats.name++; } while (0) +#define EVAL_CALL_STAT_INC(name) do { if (_py_stats) _py_stats->call_stats.eval_calls[name]++; } while (0) #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) \ - do { if (PyFunction_Check(callable)) _py_stats.call_stats.eval_calls[(name)]++; } while (0) + do { if (_py_stats && PyFunction_Check(callable)) _py_stats->call_stats.eval_calls[name]++; } while (0) // Used by the _opcode extension which is built as a shared library PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); diff --git a/Include/pystats.h b/Include/pystats.h index bea471b..87e92aa 100644 --- a/Include/pystats.h +++ b/Include/pystats.h @@ -73,19 +73,22 @@ typedef struct _stats { ObjectStats object_stats; } PyStats; -PyAPI_DATA(PyStats) _py_stats; +PyAPI_DATA(PyStats) _py_stats_struct; +PyAPI_DATA(PyStats *) _py_stats; + +extern void _Py_StatsClear(void); extern void _Py_PrintSpecializationStats(int to_file); #ifdef _PY_INTERPRETER -#define _Py_INCREF_STAT_INC() _py_stats.object_stats.interpreter_increfs++ -#define _Py_DECREF_STAT_INC() _py_stats.object_stats.interpreter_decrefs++ +#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_increfs++; } while (0) +#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_decrefs++; } while (0) #else -#define _Py_INCREF_STAT_INC() _py_stats.object_stats.increfs++ -#define _Py_DECREF_STAT_INC() _py_stats.object_stats.decrefs++ +#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.increfs++; } while (0) +#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.decrefs++; } while (0) #endif |