Mailing List Archive

CVS: python/dist/src/Objects weakrefobject.c,1.8,1.9
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv26635/Objects

Modified Files:
weakrefobject.c
Log Message:
Remove weakref free list. This has the side effect of fixing a memory
management bug. Also, move some duplicated code into the new_weakref
fucntion.


Index: weakrefobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/weakrefobject.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** weakrefobject.c 19 Dec 2001 16:44:30 -0000 1.8
--- weakrefobject.c 27 Mar 2002 15:18:21 -0000 1.9
***************
*** 6,12 ****
((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))

- static PyWeakReference *
- free_list = NULL;
-

long
--- 6,9 ----
***************
*** 24,42 ****

static PyWeakReference *
! new_weakref(void)
{
PyWeakReference *result;

! if (free_list != NULL) {
! result = free_list;
! free_list = result->wr_next;
! result->ob_type = &_PyWeakref_RefType;
! _Py_NewReference((PyObject *)result);
! }
! else {
! result = PyObject_GC_New(PyWeakReference, &_PyWeakref_RefType);
! }
! if (result)
result->hash = -1;
return result;
}
--- 21,36 ----

static PyWeakReference *
! new_weakref(PyObject *ob, PyObject *callback)
{
PyWeakReference *result;

! result = PyObject_GC_New(PyWeakReference, &_PyWeakref_RefType);
! if (result) {
result->hash = -1;
+ result->wr_object = ob;
+ Py_XINCREF(callback);
+ result->wr_callback = callback;
+ PyObject_GC_Track(result);
+ }
return result;
}
***************
*** 77,82 ****
PyObject_GC_UnTrack((PyObject *)self);
clear_weakref(self);
! self->wr_next = free_list;
! free_list = self;
}

--- 71,75 ----
PyObject_GC_UnTrack((PyObject *)self);
clear_weakref(self);
! PyObject_GC_Del(self);
}

***************
*** 581,589 ****
Py_XINCREF(result);
else {
! result = new_weakref();
if (result != NULL) {
- Py_XINCREF(callback);
- result->wr_callback = callback;
- result->wr_object = ob;
if (callback == NULL) {
insert_head(result, list);
--- 574,579 ----
Py_XINCREF(result);
else {
! result = new_weakref(ob, callback);
if (result != NULL) {
if (callback == NULL) {
insert_head(result, list);
***************
*** 597,601 ****
insert_after(result, prev);
}
- PyObject_GC_Track(result);
}
}
--- 587,590 ----
***************
*** 625,629 ****
Py_XINCREF(result);
else {
! result = new_weakref();
if (result != NULL) {
PyWeakReference *prev;
--- 614,618 ----
Py_XINCREF(result);
else {
! result = new_weakref(ob, callback);
if (result != NULL) {
PyWeakReference *prev;
***************
*** 633,639 ****
else
result->ob_type = &_PyWeakref_ProxyType;
- result->wr_object = ob;
- Py_XINCREF(callback);
- result->wr_callback = callback;
if (callback == NULL)
prev = ref;
--- 622,625 ----
***************
*** 645,649 ****
else
insert_after(result, prev);
- PyObject_GC_Track(result);
}
}
--- 631,634 ----