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/
-~----------~----~----~----~------~----~------~--~---