Kaydet (Commit) 7e160ce3 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #23034: The output of a special Python build with defined COUNT_ALLOCS,

SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by  default.  It can
be re-enabled using the "-X showalloccount" option.  It now outputs to stderr
instead of stdout.
üst 6c94d10a
...@@ -397,6 +397,8 @@ Miscellaneous options ...@@ -397,6 +397,8 @@ Miscellaneous options
stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start
tracing with a traceback limit of *NFRAME* frames. See the tracing with a traceback limit of *NFRAME* frames. See the
:func:`tracemalloc.start` for more information. :func:`tracemalloc.start` for more information.
* ``-X showalloccount`` to enable the output of the total count of allocated
objects for each type (only works when built with ``COUNT_ALLOCS`` defined);
It also allows passing arbitrary values and retrieving them through the It also allows passing arbitrary values and retrieving them through the
:data:`sys._xoptions` dictionary. :data:`sys._xoptions` dictionary.
...@@ -410,6 +412,9 @@ Miscellaneous options ...@@ -410,6 +412,9 @@ Miscellaneous options
.. versionadded:: 3.4 .. versionadded:: 3.4
The ``-X showrefcount`` and ``-X tracemalloc`` options. The ``-X showrefcount`` and ``-X tracemalloc`` options.
.. versionadded:: 3.6
The ``-X showalloccount`` option.
Options you shouldn't use Options you shouldn't use
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
......
...@@ -646,6 +646,16 @@ Porting to Python 3.6 ...@@ -646,6 +646,16 @@ Porting to Python 3.6
This section lists previously described changes and other bugfixes This section lists previously described changes and other bugfixes
that may require changes to your code. that may require changes to your code.
Changes in 'python' Command Behavior
------------------------------------
* The output of a special Python build with defined ``COUNT_ALLOCS``,
``SHOW_ALLOC_COUNT`` or ``SHOW_TRACK_COUNT`` macros is now off by
default. It can be re-enabled using the ``-X showalloccount`` option.
It now outputs to ``stderr`` instead of ``stdout``.
(Contributed by Serhiy Storchaka in :issue:`23034`.)
Changes in the Python API Changes in the Python API
------------------------- -------------------------
......
...@@ -10,6 +10,11 @@ What's New in Python 3.6.0 alpha 3 ...@@ -10,6 +10,11 @@ What's New in Python 3.6.0 alpha 3
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #23034: The output of a special Python build with defined COUNT_ALLOCS,
SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by default. It can
be re-enabled using the "-X showalloccount" option. It now outputs to stderr
instead of stdout.
- Issue #27443: __length_hint__() of bytearray itearator no longer return - Issue #27443: __length_hint__() of bytearray itearator no longer return
negative integer for resized bytearray. negative integer for resized bytearray.
......
...@@ -82,6 +82,16 @@ static size_t count_reuse = 0; ...@@ -82,6 +82,16 @@ static size_t count_reuse = 0;
static void static void
show_alloc(void) show_alloc(void)
{ {
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);
xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
return;
fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n", fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
count_alloc); count_alloc);
fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
......
...@@ -109,6 +109,15 @@ void ...@@ -109,6 +109,15 @@ void
dump_counts(FILE* f) dump_counts(FILE* f)
{ {
PyTypeObject *tp; PyTypeObject *tp;
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);
xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
return;
for (tp = type_list; tp; tp = tp->tp_next) for (tp = type_list; tp; tp = tp->tp_next)
fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, " fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "
......
...@@ -36,6 +36,16 @@ static Py_ssize_t count_tracked = 0; ...@@ -36,6 +36,16 @@ static Py_ssize_t count_tracked = 0;
static void static void
show_track(void) show_track(void)
{ {
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);
xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
return;
fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n", fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
count_tracked + count_untracked); count_tracked + count_untracked);
fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T
......
...@@ -626,7 +626,7 @@ Py_FinalizeEx(void) ...@@ -626,7 +626,7 @@ Py_FinalizeEx(void)
/* Debugging stuff */ /* Debugging stuff */
#ifdef COUNT_ALLOCS #ifdef COUNT_ALLOCS
dump_counts(stdout); dump_counts(stderr);
#endif #endif
/* dump hash stats */ /* dump hash stats */
_PyHash_Fini(); _PyHash_Fini();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment