strange thing after call PyObject_CallMethod
"Martin v. Löwis"
martin at v.loewis.de
Sat Jan 3 13:00:18 EST 2009
> Why this happenning and who makes Py_INCREF(self)?
There are multiple possible explanations, but I think you
have ruled out most of them:
1. on_recv might be returning self. So py_result would be
the same as self, and hence be an additional reference.
However, you said that on_recv raised an exception, so
py_result should be NULL (can you confirm?)
2. there might be a reference leak in the implementation of
on_recv. However, you say that it is all fine at the
end, so this is unlikely
3. The implementation of on_recv stores the object inside
another objects. There are too many possibilities for that
to enumerate; here are some examples:
def on_recv(self, buf):
global foo, bar
foo = self # creates global reference
bar = self.on_send # creates bound method
self.foo = self # creates cyclic reference
foobar.append(self) # adds self into container
If you are using gdb, I recommend to set a watchpoint on
changes to ob_refcnt:
(gdb) p &((PyObject*)self)->ob_refcnt
$1 = (Py_ssize_t *) 0xa0cb5a0
(gdb) watch *(Py_ssize_t *) 0xa0cb5a0
Hardware watchpoint 2: *(ssize_t *) 168605088
(gdb) c
Continuing.
Hardware watchpoint 2: *(ssize_t *) 168605088
Old value = 2
New value = 1
0xb7d5f406 in list_clear (a=0xa041c74) at Objects/listobject.c:550
550 Py_XDECREF(item[i]);
As you can see: this specific object was stored in a list, and
the list is now being cleared.
HTH,
Martin
More information about the Python-list
mailing list