Message363151
There are different kinds of extension modules:
(1) no module state (m_size <= 0): **not affected** by this change. Example: _asyncio which implements m_free() to clear global variables and free lists.
(2) Have a module state but PyInit_xxx() calls PyModule_Create(): PyModule_Create() always allocates md_state. I understand that such extension module is **not affected** by this change.
(3) Multi-phase extension: PyInit_xxx() function calls PyModuleDef_Init(). Such extension module **is affected** if m_traverse, m_clear or m_free() is not NULL. Example: atexit module implements m_traverse, m_clear and m_free.
PyModuleObject structure contains Python objects like md_dict (dict), md_name (str) or md_weaklist (list):
* module_traverse() always traverses md_dict: m_traverse() is no needed for that.
* module_clear() always clears md_dict: m_clear() is no needed for that.
* module_dealloc() always deallocates md_dict, md_name and md_weaklist: m_free() is no needed for that.
* md_name is a string, it cannot be involved in a reference cycle.
I don't think that it's possible to extend PyModuleObject structure (as done by PyListObject for PyObject) to add other Python objects: md_state is designed for that. PyModule_Create() allocates exactly sizeof(PyModuleObject) bytes.
If an extension module has a module state, stores Python objects *outside* this state and uses m_traverse, m_clear and m_free to handle these objects: the GC will no longer be able to handle these objects before the module is executed with this change. If such extension module exists, I consider that it's ok to only handle objects stored outside the module state once the module is executed. The window between <the module is created> and <the module is executed> is very short. |
|
Date |
User |
Action |
Args |
2020-03-02 10:50:53 | vstinner | set | recipients:
+ vstinner |
2020-03-02 10:50:53 | vstinner | set | messageid: <1583146253.15.0.0661726213924.issue39824@roundup.psfhosted.org> |
2020-03-02 10:50:53 | vstinner | link | issue39824 messages |
2020-03-02 10:50:53 | vstinner | create | |
|