mirror of
https://github.com/python/cpython.git
synced 2025-07-13 06:15:17 +00:00

To use this, ensure that clang support was selected in Visual Studio Installer, then set the PlatformToolset environment variable to "ClangCL" and build as normal from the command line. It remains unsupported, but at least is possible now for experimentation.
123 lines
3 KiB
C
123 lines
3 KiB
C
#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. */
|
|
#if defined(_MSC_VER)
|
|
#pragma pack(push, 4)
|
|
#endif
|
|
|
|
struct
|
|
#ifdef __GNUC__
|
|
__attribute__((packed))
|
|
#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
|