Inform the cycle-detector that the a weakref object no longer needs to be
tracked as soon as it is clear; this can decrease the number of roots for the cycle detector sooner rather than later in applications which hold on to weak references beyond the time of the invalidation.
This commit is contained in:
parent
2c77355937
commit
82f1480d63
|
@ -59,6 +59,7 @@ clear_weakref(PyWeakReference *self)
|
||||||
if (self->wr_object != Py_None) {
|
if (self->wr_object != Py_None) {
|
||||||
PyWeakReference **list = GET_WEAKREFS_LISTPTR(self->wr_object);
|
PyWeakReference **list = GET_WEAKREFS_LISTPTR(self->wr_object);
|
||||||
|
|
||||||
|
PyObject_GC_Fini((PyObject *)self);
|
||||||
if (*list == self)
|
if (*list == self)
|
||||||
*list = self->wr_next;
|
*list = self->wr_next;
|
||||||
self->wr_object = Py_None;
|
self->wr_object = Py_None;
|
||||||
|
@ -78,7 +79,6 @@ static void
|
||||||
weakref_dealloc(PyWeakReference *self)
|
weakref_dealloc(PyWeakReference *self)
|
||||||
{
|
{
|
||||||
clear_weakref(self);
|
clear_weakref(self);
|
||||||
PyObject_GC_Fini((PyObject *)self);
|
|
||||||
self->wr_next = free_list;
|
self->wr_next = free_list;
|
||||||
free_list = self;
|
free_list = self;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue