By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,548 Members | 1,495 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,548 IT Pros & Developers. It's quick & easy.

[Q] Extension: Refcount for exception types

P: n/a
Hi all,

I'm currently building an extension module by hand and am confused by
the fact that as well xxmodule.c as structmodule.c and other examples
increment the refcount of the exception type(s) they are defining.
I. e. from xxmodule.c:

if (ErrorObject == NULL) {
ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
if (ErrorObject == NULL)
return;
}
Py_INCREF(ErrorObject);
^^^^^^^^^^^^^^^^^^^^^^^ I mean this one.
PyModule_AddObject(m, "error", ErrorObject);

I know that PyModule_AddObject steals a reference, but now
ErrorObject's refcount should be 2, isn't it? I just fail to see
how the refcount can return to 0. I'm sure this is simple to explain,
so please enlighten me, why this isn't a leak.
cheers,

aa
Jul 18 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
Ames Andreas (MPA/DF) wrote:
Py_INCREF(ErrorObject);
^^^^^^^^^^^^^^^^^^^^^^^ I mean this one.
PyModule_AddObject(m, "error", ErrorObject);

I know that PyModule_AddObject steals a reference, but now
ErrorObject's refcount should be 2, isn't it? I just fail to see
how the refcount can return to 0. I'm sure this is simple to explain,
so please enlighten me, why this isn't a leak.


It is a leak, but that is intentional. If the INCREF was not there,
and somebody would delete "error" from the dictionary, then the
error class would go away, and ErrorObject would be a dangling pointer.

Since the module C code refers to the exception through ErrorObject,
it must keep a reference that cannot go away. This is indeed a leak
because there is no module shutdown code which could decref ErrorObject,
and set it to NULL.

Regards,
Martin

Jul 18 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.