On Oct 18, 6:16 am, Robert Bradshaw <[EMAIL PROTECTED]>
wrote:

Hi Robert,

> No cleanup function is ever generated, but atexit sounds perfect.

Good that you seem to agree with my analysis. I ran across it be sheer
accident while looking at some linker issue that roed asked me about.

> I'm the obvious person to implement this,

Pretty much 100% what I just claimed in IRC, but cwitty might look at
it during Bug Day 4.

> I'll see if I can find the time to do so soon.
>

Let's hope so.

> - Robert
>

Cheers,

Michael

> On Oct 17, 2007, at 9:04 PM, mabshoff wrote:
>
>
>
> > Hello,
>
> > for every module Cython generates "runtime support code" that is place
> > at the end of the converted file. Each one of those has an
> > __Pyx_Import function that gets called from
>
> > PyMODINIT_FUNC init$MODULENAME(void)
>
> > static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
> >     PyObject *__import__ = 0;
> >     PyObject *empty_list = 0;
> >     PyObject *module = 0;
> >     PyObject *global_dict = 0;
> >     PyObject *empty_dict = 0;
> >     PyObject *list;
> >     __import__ = PyObject_GetAttrString(__pyx_b, "__import__");
> >     if (!__import__)
> >         goto bad;
> >     if (from_list)
> >         list = from_list;
> >     else {
> >         empty_list = PyList_New(0);
> >         if (!empty_list)
> >             goto bad;
> >         list = empty_list;
> >     }
> >     global_dict = PyModule_GetDict(__pyx_m);
> >     if (!global_dict)
> >         goto bad;
> >     empty_dict = PyDict_New();
> >     if (!empty_dict)
> >         goto bad;
> >     module = PyObject_CallFunction(__import__, "OOOO",
> >         name, global_dict, empty_dict, list);
> > bad:
> >     Py_XDECREF(empty_list);
> >     Py_XDECREF(__import__);
> >     Py_XDECREF(empty_dict);
> >     return module;
> > }
>
> > In that function PyMODINIT_FUNC init$MODULENAME(void) we also call
> > __Pyx_ImportType quite often:
>
> > static PyTypeObject *__Pyx_ImportType(char *module_name, char
> > *class_name,
> >     long size)
> > {
> >     PyObject *py_module_name = 0;
> >     PyObject *py_class_name = 0;
> >     PyObject *py_name_list = 0;
> >     PyObject *py_module = 0;
> >     PyObject *result = 0;
>
> >     py_module_name = PyString_FromString(module_name);
> >     if (!py_module_name)
> >         goto bad;
> >     py_class_name = PyString_FromString(class_name);
> >     if (!py_class_name)
> >         goto bad;
> >     py_name_list = PyList_New(1);
> >     if (!py_name_list)
> >         goto bad;
> >     Py_INCREF(py_class_name);
> >     if (PyList_SetItem(py_name_list, 0, py_class_name) < 0)
> >         goto bad;
> >     py_module = __Pyx_Import(py_module_name, py_name_list);
> >     if (!py_module)
> >         goto bad;
> >     result = PyObject_GetAttr(py_module, py_class_name);
> >     if (!result)
> >         goto bad;
> >     if (!PyType_Check(result)) {
> >         PyErr_Format(PyExc_TypeError,
> >             "%s.%s is not a type object",
> >             module_name, class_name);
> >         goto bad;
> >     }
> >     if (((PyTypeObject *)result)->tp_basicsize != size) {
> >         PyErr_Format(PyExc_ValueError,
> >             "%s.%s does not appear to be the correct type object",
> >             module_name, class_name);
> >         goto bad;
> >     }
> >     goto done;
> > bad:
> >     Py_XDECREF(result);
> >     result = 0;
> > done:
> >     Py_XDECREF(py_module_name);
> >     Py_XDECREF(py_class_name);
> >     Py_XDECREF(py_name_list);
> >     return (PyTypeObject *)result;
> > }
>
> > As one can see certain PyObject have refcounts greater 0 when
> > initialization is successful. But I cannot find a cleanup function
> > that would decrease the reference count upon exit. Consequently
> > python's garbage collector never frees those dictionaries, which in
> > most cases doesn't matter because we are exiting python anyway [some
> > people claim that one shouldn't care about still reachable memory,
> > because cleaning it up the nice way just slows down the termination of
> > a process because the system will reap the heap and stack
> > automatically]. But it pollutes the memcheck log, which is why I care
> > about this.
>
> > The usual way to call those functions for each module would be to
> > register an atexit function, see
>
> >http://docs.python.org/lib/module-atexit.html
>
> > So if anybody want to write am autogenerated cleanup function for
> > Cython and register it via atexit that person would be very welcome :)
>
> > Cheers,
> > Michael


--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/
-~----------~----~----~----~------~----~------~--~---

Reply via email to