summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2022-12-12 15:44:23 (GMT)
committerGitHub <noreply@github.com>2022-12-12 15:44:23 (GMT)
commit8790d4d31fcd3abaccf31d27f72a8684adfc9dee (patch)
tree5c1f124cb8c98bed097f002004901ee25ad6fc6a /Include
parent1583c6e326a8454d3c806763620e1329bf6b7cbe (diff)
downloadcpython-8790d4d31fcd3abaccf31d27f72a8684adfc9dee.zip
cpython-8790d4d31fcd3abaccf31d27f72a8684adfc9dee.tar.gz
cpython-8790d4d31fcd3abaccf31d27f72a8684adfc9dee.tar.bz2
gh-81057: Move tracemalloc Globals to _PyRuntimeState (gh-100151)
https://github.com/python/cpython/issues/81057
Diffstat (limited to 'Include')
-rw-r--r--Include/internal/pycore_pymem.h22
-rw-r--r--Include/internal/pycore_runtime.h5
-rw-r--r--Include/internal/pycore_runtime_init.h4
-rw-r--r--Include/internal/pycore_tracemalloc.h121
4 files changed, 124 insertions, 28 deletions
diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h
index 5749af7..4cc953d 100644
--- a/Include/internal/pycore_pymem.h
+++ b/Include/internal/pycore_pymem.h
@@ -90,28 +90,6 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName(
PYMEM_ALLOCATOR_NOT_SET does nothing. */
PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator);
-struct _PyTraceMalloc_Config {
- /* Module initialized?
- Variable protected by the GIL */
- enum {
- TRACEMALLOC_NOT_INITIALIZED,
- TRACEMALLOC_INITIALIZED,
- TRACEMALLOC_FINALIZED
- } initialized;
-
- /* Is tracemalloc tracing memory allocations?
- Variable protected by the GIL */
- int tracing;
-
- /* limit of the number of frames in a traceback, 1 by default.
- Variable protected by the GIL. */
- int max_nframe;
-};
-
-#define _PyTraceMalloc_Config_INIT \
- {.initialized = TRACEMALLOC_NOT_INITIALIZED, \
- .tracing = 0, \
- .max_nframe = 1}
#ifdef __cplusplus
}
diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h
index fe2de5f..99ec6fc 100644
--- a/Include/internal/pycore_runtime.h
+++ b/Include/internal/pycore_runtime.h
@@ -23,6 +23,7 @@ extern "C" {
#include "pycore_pythread.h" // struct _pythread_runtime_state
#include "pycore_obmalloc.h" // struct obmalloc_state
#include "pycore_time.h" // struct _time_runtime_state
+#include "pycore_tracemalloc.h" // struct _tracemalloc_runtime_state
#include "pycore_unicodeobject.h" // struct _Py_unicode_runtime_ids
struct _getargs_runtime_state {
@@ -137,11 +138,9 @@ typedef struct pyruntimestate {
struct _ceval_runtime_state ceval;
struct _gilstate_runtime_state gilstate;
struct _getargs_runtime_state getargs;
- struct {
- struct _PyTraceMalloc_Config config;
- } tracemalloc;
struct _dtoa_runtime_state dtoa;
struct _fileutils_state fileutils;
+ struct _tracemalloc_runtime_state tracemalloc;
PyPreConfig preconfig;
diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h
index b569e58..029357d 100644
--- a/Include/internal/pycore_runtime_init.h
+++ b/Include/internal/pycore_runtime_init.h
@@ -50,13 +50,11 @@ extern "C" {
in accordance with the specification. */ \
.autoTSSkey = Py_tss_NEEDS_INIT, \
}, \
- .tracemalloc = { \
- .config = _PyTraceMalloc_Config_INIT, \
- }, \
.dtoa = _dtoa_runtime_state_INIT(runtime), \
.fileutils = { \
.force_ascii = -1, \
}, \
+ .tracemalloc = _tracemalloc_runtime_state_INIT, \
.float_state = { \
.float_format = _py_float_format_unknown, \
.double_format = _py_float_format_unknown, \
diff --git a/Include/internal/pycore_tracemalloc.h b/Include/internal/pycore_tracemalloc.h
new file mode 100644
index 0000000..08d7d10
--- /dev/null
+++ b/Include/internal/pycore_tracemalloc.h
@@ -0,0 +1,121 @@
+#ifndef Py_INTERNAL_TRACEMALLOC_H
+#define Py_INTERNAL_TRACEMALLOC_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "pycore_hashtable.h" // _Py_hashtable_t
+
+
+/* Trace memory blocks allocated by PyMem_RawMalloc() */
+#define TRACE_RAW_MALLOC
+
+
+struct _PyTraceMalloc_Config {
+ /* Module initialized?
+ Variable protected by the GIL */
+ enum {
+ TRACEMALLOC_NOT_INITIALIZED,
+ TRACEMALLOC_INITIALIZED,
+ TRACEMALLOC_FINALIZED
+ } initialized;
+
+ /* Is tracemalloc tracing memory allocations?
+ Variable protected by the GIL */
+ int tracing;
+
+ /* limit of the number of frames in a traceback, 1 by default.
+ Variable protected by the GIL. */
+ int max_nframe;
+};
+
+
+/* Pack the frame_t structure to reduce the memory footprint on 64-bit
+ architectures: 12 bytes instead of 16. */
+struct
+#ifdef __GNUC__
+__attribute__((packed))
+#elif defined(_MSC_VER)
+#pragma pack(push, 4)
+#endif
+tracemalloc_frame {
+ /* filename cannot be NULL: "<unknown>" is used if the Python frame
+ filename is NULL */
+ PyObject *filename;
+ unsigned int lineno;
+};
+#ifdef _MSC_VER
+#pragma pack(pop)
+#endif
+
+struct tracemalloc_traceback {
+ Py_uhash_t hash;
+ /* Number of frames stored */
+ uint16_t nframe;
+ /* Total number of frames the traceback had */
+ uint16_t total_nframe;
+ struct tracemalloc_frame frames[1];
+};
+
+
+struct _tracemalloc_runtime_state {
+ struct _PyTraceMalloc_Config config;
+
+ /* Protected by the GIL */
+ struct {
+ PyMemAllocatorEx mem;
+ PyMemAllocatorEx raw;
+ PyMemAllocatorEx obj;
+ } allocators;
+
+#if defined(TRACE_RAW_MALLOC)
+ PyThread_type_lock tables_lock;
+#endif
+ /* Size in bytes of currently traced memory.
+ Protected by TABLES_LOCK(). */
+ size_t traced_memory;
+ /* Peak size in bytes of traced memory.
+ Protected by TABLES_LOCK(). */
+ size_t peak_traced_memory;
+ /* Hash table used as a set to intern filenames:
+ PyObject* => PyObject*.
+ Protected by the GIL */
+ _Py_hashtable_t *filenames;
+ /* Buffer to store a new traceback in traceback_new().
+ Protected by the GIL. */
+ struct tracemalloc_traceback *traceback;
+ /* Hash table used as a set to intern tracebacks:
+ traceback_t* => traceback_t*
+ Protected by the GIL */
+ _Py_hashtable_t *tracebacks;
+ /* pointer (void*) => trace (trace_t*).
+ Protected by TABLES_LOCK(). */
+ _Py_hashtable_t *traces;
+ /* domain (unsigned int) => traces (_Py_hashtable_t).
+ Protected by TABLES_LOCK(). */
+ _Py_hashtable_t *domains;
+
+ struct tracemalloc_traceback empty_traceback;
+
+ Py_tss_t reentrant_key;
+};
+
+#define _tracemalloc_runtime_state_INIT \
+ { \
+ .config = { \
+ .initialized = TRACEMALLOC_NOT_INITIALIZED, \
+ .tracing = 0, \
+ .max_nframe = 1, \
+ }, \
+ .reentrant_key = Py_tss_NEEDS_INIT, \
+ }
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif // !Py_INTERNAL_TRACEMALLOC_H