summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-07-03 18:03:53 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-07-03 18:03:53 (GMT)
commit7e160ce356036bccda2608d9ee10bfe276dfa97a (patch)
tree8c5ff466786f788afa0d8400c8d8c57211e85cdb
parent6c94d10a193ffdaad9d3b7c2376d9f4de776575f (diff)
downloadcpython-7e160ce356036bccda2608d9ee10bfe276dfa97a.zip
cpython-7e160ce356036bccda2608d9ee10bfe276dfa97a.tar.gz
cpython-7e160ce356036bccda2608d9ee10bfe276dfa97a.tar.bz2
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.
-rw-r--r--Doc/using/cmdline.rst5
-rw-r--r--Doc/whatsnew/3.6.rst10
-rw-r--r--Misc/NEWS5
-rw-r--r--Objects/listobject.c10
-rw-r--r--Objects/object.c9
-rw-r--r--Objects/tupleobject.c10
-rw-r--r--Python/pylifecycle.c2
7 files changed, 50 insertions, 1 deletions
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
index 49fe3a0..905f14d 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
@@ -397,6 +397,8 @@ Miscellaneous options
stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start
tracing with a traceback limit of *NFRAME* frames. See the
: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
:data:`sys._xoptions` dictionary.
@@ -410,6 +412,9 @@ Miscellaneous options
.. versionadded:: 3.4
The ``-X showrefcount`` and ``-X tracemalloc`` options.
+ .. versionadded:: 3.6
+ The ``-X showalloccount`` option.
+
Options you shouldn't use
~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
index 21e887f..1550eef 100644
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -646,6 +646,16 @@ Porting to Python 3.6
This section lists previously described changes and other bugfixes
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
-------------------------
diff --git a/Misc/NEWS b/Misc/NEWS
index 014ac54..c9a78d0 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,11 @@ What's New in Python 3.6.0 alpha 3
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
negative integer for resized bytearray.
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 6e2d026..ddc0fee 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -82,6 +82,16 @@ static size_t count_reuse = 0;
static 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",
count_alloc);
fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
diff --git a/Objects/object.c b/Objects/object.c
index c83c8ec..559794f 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -109,6 +109,15 @@ void
dump_counts(FILE* f)
{
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)
fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index a7774e2..1b41258 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -36,6 +36,16 @@ static Py_ssize_t count_tracked = 0;
static 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",
count_tracked + count_untracked);
fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 72a00e6..2d2dcba 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -626,7 +626,7 @@ Py_FinalizeEx(void)
/* Debugging stuff */
#ifdef COUNT_ALLOCS
- dump_counts(stdout);
+ dump_counts(stderr);
#endif
/* dump hash stats */
_PyHash_Fini();