From: Victor Stinner Date: Thu, 25 Oct 2018 13:54:13 +0000 (+0200) Subject: bpo-35053: Add Include/tracemalloc.h (GH-10091) X-Git-Tag: v3.8.0a1~682 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6279c1c5003cd94b5e04e568ce3df7c4e8f1eaa3;p=python bpo-35053: Add Include/tracemalloc.h (GH-10091) * Modify object.h to ensure that pymem.h is included, to get _Py_tracemalloc_config variable. * Move _PyTraceMalloc_XXX() functions to tracemalloc.h, they need PyObject type. Break circular dependency between pymem.h and object.h. --- diff --git a/Include/Python.h b/Include/Python.h index 1bac5bd542..80200feb90 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 8cd57d21a4..c0371c8290 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 6299ab405a..e993628a21 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 0000000000..cf5bb54ea0 --- /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 333ab9b382..61b469d450 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 4a05d590be..cb835390ee 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 25b1011340..510a9c2b2e 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -321,6 +321,9 @@ Include + + Include + Include