File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -134,6 +134,9 @@ PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
134134PyAPI_FUNC (int ) PyState_RemoveModule (struct PyModuleDef * );
135135#endif
136136PyAPI_FUNC (PyObject * ) PyState_FindModule (struct PyModuleDef * );
137+ #ifndef Py_LIMITED_API
138+ PyAPI_FUNC (void ) _PyState_ClearModules (void );
139+ #endif
137140
138141PyAPI_FUNC (PyThreadState * ) PyThreadState_New (PyInterpreterState * );
139142PyAPI_FUNC (PyThreadState * ) _PyThreadState_Prealloc (PyInterpreterState * );
Original file line number Diff line number Diff line change @@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
1010Core and Builtins
1111-----------------
1212
13+ - Issue #10241: Clear extension module dict copies at interpreter shutdown.
14+ Patch by Neil Schemenauer, minimally modified.
15+
1316- Issue #9035: ismount now recognises volumes mounted below a drive root
1417 on Windows. Original patch by Atsuo Ishimoto.
1518
Original file line number Diff line number Diff line change @@ -380,6 +380,8 @@ PyImport_Cleanup(void)
380380 builtins = interp -> builtins ;
381381 interp -> builtins = PyDict_New ();
382382 Py_DECREF (builtins );
383+ /* Clear module dict copies stored in the interpreter state */
384+ _PyState_ClearModules ();
383385 /* Collect references */
384386 _PyGC_CollectNoFail ();
385387 /* Dump GC stats before it's too late, since it uses the warnings
Original file line number Diff line number Diff line change @@ -320,6 +320,31 @@ PyState_RemoveModule(struct PyModuleDef* def)
320320 return PyList_SetItem (state -> modules_by_index , index , Py_None );
321321}
322322
323+ /* used by import.c:PyImport_Cleanup */
324+ void
325+ _PyState_ClearModules (void )
326+ {
327+ PyInterpreterState * state = PyThreadState_GET ()-> interp ;
328+ if (state -> modules_by_index ) {
329+ Py_ssize_t i ;
330+ for (i = 0 ; i < PyList_GET_SIZE (state -> modules_by_index ); i ++ ) {
331+ PyObject * m = PyList_GET_ITEM (state -> modules_by_index , i );
332+ if (PyModule_Check (m )) {
333+ /* cleanup the saved copy of module dicts */
334+ PyModuleDef * md = PyModule_GetDef (m );
335+ if (md )
336+ Py_CLEAR (md -> m_base .m_copy );
337+ }
338+ }
339+ /* Setting modules_by_index to NULL could be dangerous, so we
340+ clear the list instead. */
341+ if (PyList_SetSlice (state -> modules_by_index ,
342+ 0 , PyList_GET_SIZE (state -> modules_by_index ),
343+ NULL ))
344+ PyErr_WriteUnraisable (state -> modules_by_index );
345+ }
346+ }
347+
323348void
324349PyThreadState_Clear (PyThreadState * tstate )
325350{
You can’t perform that action at this time.
0 commit comments