mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									6c94d10a19
								
							
						
					
					
						commit
						7e160ce356
					
				
					 7 changed files with 50 additions and 1 deletions
				
			
		|  | @ -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 | ||||||
|    .. 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 | ||||||
| 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 | ||||||
| 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; | ||||||
| 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 | ||||||
| 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; | ||||||
| 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) | ||||||
| 
 | 
 | ||||||
|     /* 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(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka