questions about memory management

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

questions about memory management

Julia Lawall
In Python-3.2.3/Python/import.c, in the function
_PyImport_FixupExtensionUnicode, is any call to PyDict_DelItemString
needed before the final failure returns?

     modules = PyImport_GetModuleDict();
     if (PyDict_SetItemString(modules, name, mod) < 0)
         return -1;
     if (_PyState_AddModule(mod, def) < 0) {
         PyDict_DelItemString(modules, name);
         return -1;
     }
     if (def->m_size == -1) {
         if (def->m_base.m_copy) {
             /* Somebody already imported the module,
                likely under a different name.
                XXX this should really not happen. */
             Py_DECREF(def->m_base.m_copy);
             def->m_base.m_copy = NULL;
         }
         dict = PyModule_GetDict(mod);
         if (dict == NULL)
             return -1;
         def->m_base.m_copy = PyDict_Copy(dict);
         if (def->m_base.m_copy == NULL)
             return -1;
     }

In Python-3.2.3/Modules/ossaudiodev.c, in the function build_namelists, is
it intentional that labels is not freed in the last failure case:

     if (PyModule_AddObject(module, "control_labels", labels) == -1)
         goto error2;
     if (PyModule_AddObject(module, "control_names", names) == -1)
         goto error1;

     return 0;

error2:
     Py_XDECREF(labels);
error1:
     Py_XDECREF(names);
     return -1;

thanks,
julia
_______________________________________________
Python-Dev mailing list
[hidden email]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: http://mail.python.org/mailman/options/python-dev/lists%2B1324100855712-1801473%40n6.nabble.com
Reply | Threaded
Open this post in threaded view
|

Re: questions about memory management

Antoine Pitrou

Hello Julia,

On Sat, 28 Apr 2012 10:06:52 +0200 (CEST)
Julia Lawall <[hidden email]> wrote:
> In Python-3.2.3/Python/import.c, in the function
> _PyImport_FixupExtensionUnicode, is any call to PyDict_DelItemString
> needed before the final failure returns?

I would say it probably does, but it would need further examination.
Some error-checking code paths in our C code base may lack proper
cleanup, especially when an error is unlikely.
Could you open an issue at http://bugs.python.org with this?

> In Python-3.2.3/Modules/ossaudiodev.c, in the function build_namelists, is
> it intentional that labels is not freed in the last failure case:

The successful call to PyModule_AddObject() steals a reference to
`labels`, so it doesn't need to be decrefed again (the reference is
not owned by the init function anymore).

Regards

Antoine.

>      if (PyModule_AddObject(module, "control_labels", labels) == -1)
>          goto error2;
>      if (PyModule_AddObject(module, "control_names", names) == -1)
>          goto error1;
>
>      return 0;
>
> error2:
>      Py_XDECREF(labels);
> error1:
>      Py_XDECREF(names);
>      return -1;
>
> thanks,
> julia


_______________________________________________
Python-Dev mailing list
[hidden email]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: http://mail.python.org/mailman/options/python-dev/lists%2B1324100855712-1801473%40n6.nabble.com