diff -r 49991d0f41e8 Modules/spwdmodule.c --- a/Modules/spwdmodule.c Mon Aug 20 11:47:34 2012 +0200 +++ b/Modules/spwdmodule.c Mon Aug 20 11:48:24 2012 +0200 @@ -51,8 +51,38 @@ 9, }; -static int initialized; -static PyTypeObject StructSpwdType; +typedef struct { + int initialized; + PyObject *StructSpwdType; +} spwdstate; + + +#define spwd_state(o) ((spwdstate *)PyModule_GetState(o)) + +static int +spwd_clear(PyObject *m) +{ + Py_CLEAR(spwd_state(m)->StructSpwdType); + return 0; +} + +static int +spwd_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(spwd_state(m)->StructSpwdType); + return 0; +} + +static void +spwd_free(void *m) +{ + spwd_clear((PyObject *)m); +} + +static PyModuleDef spwdmodule; + +#define spwdstate_global ((spwdstate *)PyModule_GetState(PyState_FindModule(&spwdmodule))) + static void @@ -70,7 +100,7 @@ static PyObject *mkspent(struct spwd *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructSpwdType); + PyObject *v = PyStructSequence_New(spwdstate_global->StructSpwdType); if (v == NULL) return NULL; @@ -181,26 +211,31 @@ PyModuleDef_HEAD_INIT, "spwd", spwd__doc__, - -1, + sizeof(spwdstate), spwd_methods, NULL, - NULL, - NULL, - NULL + spwd_traverse, + spwd_clear, + spwd_free }; PyMODINIT_FUNC PyInit_spwd(void) { PyObject *m; - m=PyModule_Create(&spwdmodule); - if (m == NULL) - return NULL; - if (!initialized) - PyStructSequence_InitType(&StructSpwdType, - &struct_spwd_type_desc); - Py_INCREF((PyObject *) &StructSpwdType); - PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType); - initialized = 1; + + m = PyState_FindModule(&spwdmodule); + if(m == NULL) { + m = PyModule_Create(&spwdmodule); + if (m == NULL) + return NULL; + spwdmodule(m)->initialized = 0; + } + if (!spwd_state(m)->initialized) + spwd_state(m)->StructSpwdType = + (PyObject *)PyStructSequence_NewType(&struct_spwd_type_desc); + Py_INCREF(spwd_state(m)->StructSpwdType); + PyModule_AddObject(m, "struct_spwd", spwd_state(m)->StructSpwdType); + spwd_state(m)->initialized = 1; return m; }