diff -r 514e0635c908 Modules/pwdmodule.c --- a/Modules/pwdmodule.c Thu Aug 16 11:44:13 2012 +0200 +++ b/Modules/pwdmodule.c Thu Aug 16 21:46:30 2012 +0200 @@ -41,8 +41,38 @@ exception is raised if the entry asked for cannot be found."); -static int initialized; -static PyTypeObject StructPwdType; +typedef struct { + int initialized; + PyObject *StructPwdType; +} pwdstate; + + +#define pwd_state(o) ((pwdstate *)PyModule_GetState(o)) + +static int +pwd_clear(PyObject *m) +{ + Py_CLEAR(pwd_state(m)->StructPwdType); + return 0; +} + +static int +pwd_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(pwd_state(m)->StructPwdType); + return 0; +} + +static void +pwd_free(void *m) +{ + pwd_clear((PyObject *)m); +} + +static PyModuleDef pwdmodule; + +#define pwdstate_global ((pwdstate *)PyModule_GetState(PyState_FindModule(&pwdmodule))) + static void sets(PyObject *v, int i, const char* val) @@ -61,7 +91,7 @@ mkpwent(struct passwd *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructPwdType); + PyObject *v = PyStructSequence_New((PyTypeObject *)pwdstate_global->StructPwdType); if (v == NULL) return NULL; @@ -194,12 +224,12 @@ PyModuleDef_HEAD_INIT, "pwd", pwd__doc__, - -1, + sizeof(pwdstate), pwd_methods, NULL, - NULL, - NULL, - NULL + pwd_traverse, + pwd_clear, + pwd_free }; @@ -207,16 +237,22 @@ PyInit_pwd(void) { PyObject *m; - m = PyModule_Create(&pwdmodule); - if (m == NULL) - return NULL; - if (!initialized) { - PyStructSequence_InitType(&StructPwdType, - &struct_pwd_type_desc); - initialized = 1; + m = PyState_FindModule(&pwdmodule); + if(m == NULL) { + m = PyModule_Create(&pwdmodule); + if (m == NULL) + return NULL; + pwd_state(m)->initialized = 0; } - Py_INCREF((PyObject *) &StructPwdType); - PyModule_AddObject(m, "struct_passwd", (PyObject *) &StructPwdType); + + if (!pwd_state(m)->initialized) { + pwd_state(m)->StructPwdType = (PyObject *)PyStructSequence_NewType( + &struct_pwd_type_desc + ); + pwd_state(m)->initialized = 1; + } + Py_INCREF(pwd_state(m)->StructPwdType); + PyModule_AddObject(m, "struct_passwd", pwd_state(m)->StructPwdType); return m; }