[2.7] bpo-31692: Add PYTHONSHOWALLOCCOUNT env var (GH-3927)

bpo-31692, bpo-19527:

* Add a new PYTHONSHOWALLOCCOUNT environment variable, similar to
  the Python 3 "-X showalloccount" option
* When Python is compiled with COUNT_ALLOCS, the new
  PYTHONSHOWALLOCCOUNT environment variable now has to be set to dump
  allocation counts into stderr on shutdown. Moreover, allocations
  statistics are now dumped into stderr rather than stdout.
* Add @test.support.requires_type_collecting decorator: skip test if
  COUNT_ALLOCS is defined
* Fix tests for COUNT_ALLOCS: decorate some methods with
  @requires_type_collecting
* test_sys.test_objecttypes(): update object type when COUNT_ALLOCS
  is defined
This commit is contained in:
Victor Stinner 2017-10-17 02:25:23 -07:00 committed by GitHub
parent 3c082a7fdb
commit 7b4ba62e38
10 changed files with 28 additions and 4 deletions

View File

@ -1101,7 +1101,7 @@ The next fields, up to and including :c:member:`~PyTypeObject.tp_weaklist`, only
The remaining fields are only defined if the feature test macro
:const:`COUNT_ALLOCS` is defined, and are for internal use only. They are
documented here for completeness. None of these fields are inherited by
subtypes.
subtypes. See the :envvar:`PYTHONSHOWALLOCCOUNT` environment variable.
.. c:member:: Py_ssize_t PyTypeObject.tp_allocs

View File

@ -664,6 +664,13 @@ if Python was configured with the ``--with-pydebug`` build option.
If set, Python will print memory allocation statistics every time a new
object arena is created, and on shutdown.
.. envvar:: PYTHONSHOWALLOCCOUNT
If set and Python was compiled with ``COUNT_ALLOCS`` defined, Python will
dump allocations counts into stderr on shutdown.
.. versionadded:: 2.7.15
.. envvar:: PYTHONSHOWREFCOUNT
If set, Python will print the total reference count when the program

View File

@ -1795,6 +1795,9 @@ def py3k_bytes(b):
except TypeError:
return bytes(b)
requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'),
'types are immortal if COUNT_ALLOCS is defined')
def args_from_interpreter_flags():
"""Return a list of command-line arguments reproducing the current
settings in sys.flags."""

View File

@ -208,6 +208,7 @@ class TestABC(unittest.TestCase):
C()
self.assertEqual(B.counter, 1)
@test_support.requires_type_collecting
def test_cache_leak(self):
# See issue #2521.
class A(object):

View File

@ -1,5 +1,6 @@
import unittest
from test.test_support import verbose, run_unittest, start_threads
from test.support import (verbose, run_unittest, start_threads,
requires_type_collecting)
import sys
import time
import gc
@ -90,6 +91,7 @@ class GCTests(unittest.TestCase):
del a
self.assertNotEqual(gc.collect(), 0)
@requires_type_collecting
def test_newinstance(self):
class A(object):
pass

View File

@ -493,6 +493,7 @@ class ArgsTestCase(BaseTestCase):
self.assertIn(line2, reflog)
@unittest.skipUnless(Py_DEBUG, 'need a debug build')
@support.requires_type_collecting
def test_huntrleaks(self):
# test --huntrleaks
code = textwrap.dedent("""

View File

@ -748,7 +748,10 @@ class SizeofTest(unittest.TestCase):
# tupleiterator
check(iter(()), size('lP'))
# type
s = vsize('P2P15Pl4PP9PP11PI' # PyTypeObject
fmt = 'P2P15Pl4PP9PP11PI'
if hasattr(sys, 'getcounts'):
fmt += '3P2P'
s = vsize(fmt + # PyTypeObject
'39P' # PyNumberMethods
'3P' # PyMappingMethods
'10P' # PySequenceMethods

View File

@ -601,6 +601,7 @@ class ReferencesTestCase(TestBase):
del c1, c2, C, D
gc.collect()
@test_support.requires_type_collecting
def test_callback_in_cycle_resurrection(self):
import gc

View File

@ -0,0 +1,4 @@
Add a new PYTHONSHOWALLOCCOUNT environment variable. When Python is compiled
with COUNT_ALLOCS, PYTHONSHOWALLOCCOUNT now has to be set to dump allocation
counts into stderr on shutdown. Moreover, allocations statistics are now dumped
into stderr rather than stdout.

View File

@ -488,7 +488,9 @@ Py_Finalize(void)
/* Debugging stuff */
#ifdef COUNT_ALLOCS
dump_counts(stdout);
if (Py_GETENV("PYTHONSHOWALLOCCOUNT")) {
dump_counts(stderr);
}
#endif
_PyDebug_PrintTotalRefs();