diff --git a/Include/Python.h b/Include/Python.h index 1bac5bd5428..80200feb903 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -137,5 +137,6 @@ #include "dtoa.h" #include "fileutils.h" #include "pyfpe.h" +#include "tracemalloc.h" #endif /* !Py_PYTHON_H */ diff --git a/Include/object.h b/Include/object.h index 8cd57d21a40..c0371c82906 100644 --- a/Include/object.h +++ b/Include/object.h @@ -1,5 +1,8 @@ #ifndef Py_OBJECT_H #define Py_OBJECT_H + +#include "pymem.h" /* _Py_tracemalloc_config */ + #ifdef __cplusplus extern "C" { #endif diff --git a/Include/pymem.h b/Include/pymem.h index 6299ab405a0..e993628a21e 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -24,42 +24,6 @@ PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt); /* Try to get the allocators name set by _PyMem_SetupAllocators(). */ PyAPI_FUNC(const char*) _PyMem_GetAllocatorsName(void); -/* Track an allocated memory block in the tracemalloc module. - Return 0 on success, return -1 on error (failed to allocate memory to store - the trace). - - Return -2 if tracemalloc is disabled. - - If memory block is already tracked, update the existing trace. */ -PyAPI_FUNC(int) PyTraceMalloc_Track( - unsigned int domain, - uintptr_t ptr, - size_t size); - -/* Update the Python traceback of an object. - This function can be used when a memory block is reused from a free list. */ -PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); - -/* Untrack an allocated memory block in the tracemalloc module. - Do nothing if the block was not tracked. - - Return -2 if tracemalloc is disabled, otherwise return 0. */ -PyAPI_FUNC(int) PyTraceMalloc_Untrack( - unsigned int domain, - uintptr_t ptr); - -/* Get the traceback where a memory block was allocated. - - Return a tuple of (filename: str, lineno: int) tuples. - - Return None if the tracemalloc module is disabled or if the memory block - is not tracked by tracemalloc. - - Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( - unsigned int domain, - uintptr_t ptr); - PyAPI_FUNC(int) _PyMem_IsFreed(void *ptr, size_t size); #endif /* !defined(Py_LIMITED_API) */ @@ -246,7 +210,9 @@ PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( /* bpo-35053: expose _Py_tracemalloc_config for performance: _Py_NewReference() needs an efficient check to test if tracemalloc is - tracing. */ + tracing. + + It has to be defined in pymem.h, before object.h is included. */ struct _PyTraceMalloc_Config { /* Module initialized? Variable protected by the GIL */ diff --git a/Include/tracemalloc.h b/Include/tracemalloc.h new file mode 100644 index 00000000000..cf5bb54ea08 --- /dev/null +++ b/Include/tracemalloc.h @@ -0,0 +1,42 @@ +#ifndef Py_TRACEMALLOC_H +#define Py_TRACEMALLOC_H + +#ifndef Py_LIMITED_API +/* Track an allocated memory block in the tracemalloc module. + Return 0 on success, return -1 on error (failed to allocate memory to store + the trace). + + Return -2 if tracemalloc is disabled. + + If memory block is already tracked, update the existing trace. */ +PyAPI_FUNC(int) PyTraceMalloc_Track( + unsigned int domain, + uintptr_t ptr, + size_t size); + +/* Update the Python traceback of an object. + This function can be used when a memory block is reused from a free list. */ +PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); + +/* Untrack an allocated memory block in the tracemalloc module. + Do nothing if the block was not tracked. + + Return -2 if tracemalloc is disabled, otherwise return 0. */ +PyAPI_FUNC(int) PyTraceMalloc_Untrack( + unsigned int domain, + uintptr_t ptr); + +/* Get the traceback where a memory block was allocated. + + Return a tuple of (filename: str, lineno: int) tuples. + + Return None if the tracemalloc module is disabled or if the memory block + is not tracked by tracemalloc. + + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( + unsigned int domain, + uintptr_t ptr); +#endif + +#endif /* !Py_TRACEMALLOC_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 333ab9b3824..61b469d4504 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1017,6 +1017,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/symtable.h \ $(srcdir)/Include/sysmodule.h \ $(srcdir)/Include/traceback.h \ + $(srcdir)/Include/tracemalloc.h \ $(srcdir)/Include/tupleobject.h \ $(srcdir)/Include/ucnhash.h \ $(srcdir)/Include/unicodeobject.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 4a05d590be5..cb835390ee1 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -177,6 +177,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 25b1011340a..510a9c2b2e4 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -321,6 +321,9 @@ Include + + Include + Include