SF bug 578752: COUNT_ALLOCS vs heap types

Repair segfaults and infinite loops in COUNT_ALLOCS builds in the
presence of new-style (heap-allocated) classes/types.

Bugfix candidate.  I'll backport this to 2.2.  It's irrelevant in 2.1.
This commit is contained in:
Tim Peters 2002-07-08 22:11:52 +00:00
parent d1b2045958
commit c6a3ff634a
2 changed files with 17 additions and 0 deletions

View File

@ -294,6 +294,14 @@ Tools/Demos
Build Build
- A bug was fixed that could cause COUNT_ALLOCS builds to segfault, or
get into infinite loops, when a new-style class got garbage-collected.
Unfortunately, to avoid this, the way COUNT_ALLOCS works requires
that new-style classes be immortal in COUNT_ALLOCS builds. Note that
COUNT_ALLOCS is not enabled by default, in either release or debug
builds, and that new-style classes are immortal only in COUNT_ALLOCS
builds.
- Compiling out the cyclic garbage collector is no longer an option. - Compiling out the cyclic garbage collector is no longer an option.
The old symbol WITH_CYCLE_GC is now ignored, and Python.h arranges The old symbol WITH_CYCLE_GC is now ignored, and Python.h arranges
that it's always defined (for the benefit of any extension modules that it's always defined (for the benefit of any extension modules

View File

@ -74,6 +74,15 @@ inc_count(PyTypeObject *tp)
if (tp->tp_next != NULL) /* sanity check */ if (tp->tp_next != NULL) /* sanity check */
Py_FatalError("XXX inc_count sanity check"); Py_FatalError("XXX inc_count sanity check");
tp->tp_next = type_list; 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
* until program exit. That's why we're careful with
* refcounts here. type_list gets a new reference to tp,
* while ownership of the reference type_list used to hold
* (if any) was transferred to tp->tp_next in the line above.
* tp is thus effectively immortal after this.
*/
Py_INCREF(tp);
type_list = tp; type_list = tp;
} }
tp->tp_allocs++; tp->tp_allocs++;