[Q] Extension: Refcount for exception types

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Ames Andreas (MPA/DF)

    #1

    [Q] Extension: Refcount for exception types

    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_NewExcept ion("xx.error", NULL, NULL);
    if (ErrorObject == NULL)
    return;
    }
    Py_INCREF(Error Object);
    ^^^^^^^^^^^^^^^ ^^^^^^^^ I mean this one.
    PyModule_AddObj ect(m, "error", ErrorObject);

    I know that PyModule_AddObj ect 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


  • Martin v. Löwis

    #2
    Re: [Q] Extension: Refcount for exception types

    Ames Andreas (MPA/DF) wrote:[color=blue]
    > Py_INCREF(Error Object);
    > ^^^^^^^^^^^^^^^ ^^^^^^^^ I mean this one.
    > PyModule_AddObj ect(m, "error", ErrorObject);
    >
    > I know that PyModule_AddObj ect 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.[/color]

    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

    Comment

    Working...