Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions 22 Doc/c-api/memory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,28 @@ Customize pymalloc Arena Allocator
Set the arena allocator.


tracemalloc C API
=================

.. versionadded:: 3.7

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hum, the tracemalloc doc and this doc should mention that the tracemalloc uses the default 0 to trace Python memory allocations.

Copy link
Member Author

@vstinner vstinner Jun 14, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I documented the domain 0 in the tracemalloc doc.

.. c:function: int PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr, size_t size)

Track an allocated memory block in the :mod:`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.

.. c:function: int PyTraceMalloc_Untrack(unsigned int domain, uintptr_t ptr)

Untrack an allocated memory block in the :mod:`tracemalloc` module.
Do nothing if the block was not tracked.

Return ``-2`` if tracemalloc is disabled, otherwise return ``0``.


.. _memoryexamples:

Examples
Expand Down
13 changes: 13 additions & 0 deletions 13 Doc/library/tracemalloc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,9 @@ Filter

Address space of a memory block (``int`` or ``None``).

tracemalloc uses the domain ``0`` to trace memory allocations made by
Python. C extensions can use other domains to trace other resources.

.. attribute:: inclusive

If *inclusive* is ``True`` (include), only match memory blocks allocated
Expand Down Expand Up @@ -622,6 +625,16 @@ Trace
The :attr:`Snapshot.traces` attribute is a sequence of :class:`Trace`
instances.

.. versionchanged:: 3.6
Added the :attr:`domain` attribute.

.. attribute:: domain

Address space of a memory block (``int``). Read-only property.

tracemalloc uses the domain ``0`` to trace memory allocations made by
Python. C extensions can use other domains to trace other resources.

.. attribute:: size

Size of the memory block in bytes (``int``).
Expand Down
13 changes: 5 additions & 8 deletions 13 Include/pymem.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,24 @@ PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt);
PyAPI_FUNC(int) _PyMem_PymallocEnabled(void);
#endif

/* Identifier of an address space (domain) in tracemalloc */
typedef unsigned int _PyTraceMalloc_domain_t;

/* 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(
_PyTraceMalloc_domain_t domain,
PyAPI_FUNC(int) PyTraceMalloc_Track(
unsigned int domain,
uintptr_t ptr,
size_t size);

/* 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(
_PyTraceMalloc_domain_t domain,
PyAPI_FUNC(int) PyTraceMalloc_Untrack(
unsigned int domain,
uintptr_t ptr);

/* Get the traceback where a memory block was allocated.
Expand All @@ -57,7 +54,7 @@ PyAPI_FUNC(int) _PyTraceMalloc_Untrack(

Raise an exception and return NULL on error. */
PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback(
_PyTraceMalloc_domain_t domain,
unsigned int domain,
uintptr_t ptr);
#endif /* !Py_LIMITED_API */

Expand Down
10 changes: 5 additions & 5 deletions 10 Modules/_testcapimodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -3958,15 +3958,15 @@ tracemalloc_track(PyObject *self, PyObject *args)

if (release_gil) {
Py_BEGIN_ALLOW_THREADS
res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Py_END_ALLOW_THREADS
}
else {
res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
}

if (res < 0) {
PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
return NULL;
}

Expand All @@ -3987,9 +3987,9 @@ tracemalloc_untrack(PyObject *self, PyObject *args)
if (PyErr_Occurred())
return NULL;

res = _PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
if (res < 0) {
PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
return NULL;
}

Expand Down
20 changes: 10 additions & 10 deletions 20 Modules/_tracemalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ __attribute__((packed))
#endif
{
uintptr_t ptr;
_PyTraceMalloc_domain_t domain;
unsigned int domain;
} pointer_t;

/* Pack the frame_t structure to reduce the memory footprint on 64-bit
Expand Down Expand Up @@ -578,7 +578,7 @@ tracemalloc_use_domain(void)


static void
tracemalloc_remove_trace(_PyTraceMalloc_domain_t domain, uintptr_t ptr)
tracemalloc_remove_trace(unsigned int domain, uintptr_t ptr)
{
trace_t trace;
int removed;
Expand All @@ -605,7 +605,7 @@ tracemalloc_remove_trace(_PyTraceMalloc_domain_t domain, uintptr_t ptr)


static int
tracemalloc_add_trace(_PyTraceMalloc_domain_t domain, uintptr_t ptr,
tracemalloc_add_trace(unsigned int domain, uintptr_t ptr,
size_t size)
{
pointer_t key = {ptr, domain};
Expand Down Expand Up @@ -1267,7 +1267,7 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table)


static PyObject*
trace_to_pyobject(_PyTraceMalloc_domain_t domain, trace_t *trace,
trace_to_pyobject(unsigned int domain, trace_t *trace,
_Py_hashtable_t *intern_tracebacks)
{
PyObject *trace_obj = NULL;
Expand Down Expand Up @@ -1313,7 +1313,7 @@ tracemalloc_get_traces_fill(_Py_hashtable_t *traces, _Py_hashtable_entry_t *entr
void *user_data)
{
get_traces_t *get_traces = user_data;
_PyTraceMalloc_domain_t domain;
unsigned int domain;
trace_t trace;
PyObject *tracemalloc_obj;
int res;
Expand Down Expand Up @@ -1428,7 +1428,7 @@ _tracemalloc__get_traces_impl(PyObject *module)


static traceback_t*
tracemalloc_get_traceback(_PyTraceMalloc_domain_t domain, uintptr_t ptr)
tracemalloc_get_traceback(unsigned int domain, uintptr_t ptr)
{
trace_t trace;
int found;
Expand Down Expand Up @@ -1783,8 +1783,8 @@ _PyTraceMalloc_Fini(void)
}

int
_PyTraceMalloc_Track(_PyTraceMalloc_domain_t domain, uintptr_t ptr,
size_t size)
PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr,
size_t size)
{
int res;
#ifdef WITH_THREAD
Expand Down Expand Up @@ -1812,7 +1812,7 @@ _PyTraceMalloc_Track(_PyTraceMalloc_domain_t domain, uintptr_t ptr,


int
_PyTraceMalloc_Untrack(_PyTraceMalloc_domain_t domain, uintptr_t ptr)
PyTraceMalloc_Untrack(unsigned int domain, uintptr_t ptr)
{
if (!tracemalloc_config.tracing) {
/* tracemalloc is not tracing: do nothing */
Expand All @@ -1828,7 +1828,7 @@ _PyTraceMalloc_Untrack(_PyTraceMalloc_domain_t domain, uintptr_t ptr)


PyObject*
_PyTraceMalloc_GetTraceback(_PyTraceMalloc_domain_t domain, uintptr_t ptr)
_PyTraceMalloc_GetTraceback(unsigned int domain, uintptr_t ptr)
{
traceback_t *traceback;

Expand Down
Morty Proxy This is a proxified and sanitized view of the page, visit original site.