Issue #6695: Full garbage collection runs now clear the freelist of set objects.

Initial patch by Matthias Troffaes.
This commit is contained in:
Antoine Pitrou 2011-12-16 11:24:27 +01:00
parent c144a93e98
commit 093ce9cd8c
5 changed files with 23 additions and 2 deletions

View File

@ -157,3 +157,10 @@ subtypes but not for instances of :class:`frozenset` or its subtypes.
.. c:function:: int PySet_Clear(PyObject *set)
Empty an existing set of all elements.
.. c:function:: int PySet_ClearFreeList()
Clear the free list. Return the total number of freed items.
.. versionadded:: 3.3

View File

@ -99,6 +99,8 @@ PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key,
PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set);
#ifndef Py_LIMITED_API
PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable);
PyAPI_FUNC(int) PySet_ClearFreeList(void);
#endif
#ifdef __cplusplus

View File

@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins
-----------------
- Issue #6695: Full garbage collection runs now clear the freelist of set
objects. Initial patch by Matthias Troffaes.
- Fix OSError.__init__ and OSError.__new__ so that each of them can be
overriden and take additional arguments (followup to issue #12555).

View File

@ -764,6 +764,7 @@ clear_freelists(void)
(void)PyFloat_ClearFreeList();
(void)PyList_ClearFreeList();
(void)PyDict_ClearFreeList();
(void)PySet_ClearFreeList();
}
static double

View File

@ -1068,9 +1068,10 @@ frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return emptyfrozenset;
}
void
PySet_Fini(void)
int
PySet_ClearFreeList(void)
{
int freelist_size = numfree;
PySetObject *so;
while (numfree) {
@ -1078,6 +1079,13 @@ PySet_Fini(void)
so = free_list[numfree];
PyObject_GC_Del(so);
}
return freelist_size;
}
void
PySet_Fini(void)
{
PySet_ClearFreeList();
Py_CLEAR(dummy);
Py_CLEAR(emptyfrozenset);
}