Commit 38a89161 authored by Neil Schemenauer's avatar Neil Schemenauer

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.
parent 9e38c100
...@@ -5,9 +5,6 @@ ...@@ -5,9 +5,6 @@
#define GET_WEAKREFS_LISTPTR(o) \ #define GET_WEAKREFS_LISTPTR(o) \
((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
static PyWeakReference *
free_list = NULL;
long long
_PyWeakref_GetWeakrefCount(PyWeakReference *head) _PyWeakref_GetWeakrefCount(PyWeakReference *head)
...@@ -23,21 +20,18 @@ _PyWeakref_GetWeakrefCount(PyWeakReference *head) ...@@ -23,21 +20,18 @@ _PyWeakref_GetWeakrefCount(PyWeakReference *head)
static PyWeakReference * static PyWeakReference *
new_weakref(void) new_weakref(PyObject *ob, PyObject *callback)
{ {
PyWeakReference *result; PyWeakReference *result;
if (free_list != NULL) { result = PyObject_GC_New(PyWeakReference, &_PyWeakref_RefType);
result = free_list; if (result) {
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; result->hash = -1;
result->wr_object = ob;
Py_XINCREF(callback);
result->wr_callback = callback;
PyObject_GC_Track(result);
}
return result; return result;
} }
...@@ -76,8 +70,7 @@ weakref_dealloc(PyWeakReference *self) ...@@ -76,8 +70,7 @@ weakref_dealloc(PyWeakReference *self)
{ {
PyObject_GC_UnTrack((PyObject *)self); PyObject_GC_UnTrack((PyObject *)self);
clear_weakref(self); clear_weakref(self);
self->wr_next = free_list; PyObject_GC_Del(self);
free_list = self;
} }
...@@ -580,11 +573,8 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback) ...@@ -580,11 +573,8 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback)
if (result != NULL) if (result != NULL)
Py_XINCREF(result); Py_XINCREF(result);
else { else {
result = new_weakref(); result = new_weakref(ob, callback);
if (result != NULL) { if (result != NULL) {
Py_XINCREF(callback);
result->wr_callback = callback;
result->wr_object = ob;
if (callback == NULL) { if (callback == NULL) {
insert_head(result, list); insert_head(result, list);
} }
...@@ -596,7 +586,6 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback) ...@@ -596,7 +586,6 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback)
else else
insert_after(result, prev); insert_after(result, prev);
} }
PyObject_GC_Track(result);
} }
} }
return (PyObject *) result; return (PyObject *) result;
...@@ -624,7 +613,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback) ...@@ -624,7 +613,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
if (result != NULL) if (result != NULL)
Py_XINCREF(result); Py_XINCREF(result);
else { else {
result = new_weakref(); result = new_weakref(ob, callback);
if (result != NULL) { if (result != NULL) {
PyWeakReference *prev; PyWeakReference *prev;
...@@ -632,9 +621,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback) ...@@ -632,9 +621,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
result->ob_type = &_PyWeakref_CallableProxyType; result->ob_type = &_PyWeakref_CallableProxyType;
else else
result->ob_type = &_PyWeakref_ProxyType; result->ob_type = &_PyWeakref_ProxyType;
result->wr_object = ob;
Py_XINCREF(callback);
result->wr_callback = callback;
if (callback == NULL) if (callback == NULL)
prev = ref; prev = ref;
else else
...@@ -644,7 +630,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback) ...@@ -644,7 +630,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
insert_head(result, list); insert_head(result, list);
else else
insert_after(result, prev); insert_after(result, prev);
PyObject_GC_Track(result);
} }
} }
return (PyObject *) result; return (PyObject *) result;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment