[Python-checkins] r45527 - in python/trunk: Include/object.h Misc/NEWS Objects/object.c Python/pythonrun.c (original) (raw)

martin.v.loewis python-checkins at python.org
Tue Apr 18 08:24:10 CEST 2006


Author: martin.v.loewis Date: Tue Apr 18 08:24:08 2006 New Revision: 45527

Modified: python/trunk/Include/object.h python/trunk/Misc/NEWS python/trunk/Objects/object.c python/trunk/Python/pythonrun.c Log: Remove types from type_list if they have no objects and unlist_types_without_objects is set. Give dump_counts a FILE* argument.

Modified: python/trunk/Include/object.h

--- python/trunk/Include/object.h (original) +++ python/trunk/Include/object.h Tue Apr 18 08:24:08 2006 @@ -339,6 +339,7 @@ Py_ssize_t tp_allocs; Py_ssize_t tp_frees; Py_ssize_t tp_maxalloc; + struct _typeobject *tp_prev; struct _typeobject *tp_next; #endif } PyTypeObject; @@ -598,8 +599,9 @@

#ifdef COUNT_ALLOCS PyAPI_FUNC(void) inc_count(PyTypeObject *); +PyAPI_FUNC(void) dec_count(PyTypeObject *); #define _Py_INC_TPALLOCS(OP) inc_count((OP)->ob_type) -#define _Py_INC_TPFREES(OP) (OP)->ob_type->tp_frees++ +#define _Py_INC_TPFREES(OP) dec_count((OP)->ob_type) #define _Py_DEC_TPFREES(OP) (OP)->ob_type->tp_frees-- #define _Py_COUNT_ALLOCS_COMMA , #else

Modified: python/trunk/Misc/NEWS

--- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Tue Apr 18 08:24:08 2006 @@ -12,6 +12,8 @@ Core and builtins

+- Under COUNT_ALLOCS, types are not necessarily immortal anymore. +

Modified: python/trunk/Objects/object.c

--- python/trunk/Objects/object.c (original) +++ python/trunk/Objects/object.c Tue Apr 18 08:24:08 2006 @@ -74,23 +74,30 @@

#ifdef COUNT_ALLOCS static PyTypeObject type_list; +/ All types are added to type_list, atleast when

@@ -124,10 +131,12 @@ void inc_count(PyTypeObject tp) { - if (tp->tp_allocs == 0) { + if (tp->tp_next == NULL && tp->tp_prev == NULL) { / first time; insert in linked list / if (tp->tp_next != NULL) / sanity check / Py_FatalError("XXX inc_count sanity check"); + if (type_list) + type_list->tp_prev = tp; tp->tp_next = type_list; / Note that as of Python 2.2, heap-allocated type objects * can go away, but this code requires that they stay alive @@ -150,6 +159,24 @@ if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc) tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees; } + +void dec_count(PyTypeObject tp) +{ + tp->tp_frees++; + if (unlist_types_without_objects && + tp->tp_allocs == tp->tp_frees) { + / unlink the type from type_list */ + if (tp->tp_prev) + tp->tp_prev->tp_next = tp->tp_next; + else + type_list = tp->tp_next; + if (tp->tp_next) + tp->tp_next->tp_prev = tp->tp_prev; + tp->tp_next = tp->tp_prev = NULL; + Py_DECREF(tp); + } +} + #endif

#ifdef Py_REF_DEBUG

Modified: python/trunk/Python/pythonrun.c

--- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Tue Apr 18 08:24:08 2006 @@ -311,7 +311,7 @@

#ifdef COUNT_ALLOCS -extern void dump_counts(void); +extern void dump_counts(FILE*); #endif

/* Undo the effect of Py_Initialize(). @@ -373,6 +373,13 @@ * XXX I haven't seen a real-life report of either of these. / PyGC_Collect(); +#ifdef COUNT_ALLOCS + / With COUNT_ALLOCS, it helps to run GC multiple times: + each collection might release some types from the type + list, so they become garbage. / + while (PyGC_Collect() > 0) + / nothing */; +#endif

 /* Destroy all modules */
 PyImport_Cleanup();

@@ -401,7 +408,7 @@

 /* Debugging stuff */

#ifdef COUNT_ALLOCS - dump_counts(); + dump_counts(stdout); #endif

 PRINT_TOTAL_REFS();


More information about the Python-checkins mailing list