diff -r 30f6477c415d Modules/timemodule.c --- a/Modules/timemodule.c Thu Aug 16 23:32:58 2012 +0200 +++ b/Modules/timemodule.c Thu Aug 16 23:34:58 2012 +0200 @@ -295,16 +295,48 @@ 9, }; -static int initialized; -static PyTypeObject StructTimeType; +typedef struct { + int initialized; + PyObject *StructTimeType; +} timestate; + + +#define time_state(o) ((timestate *)PyModule_GetState(o)) + +static int +time_clear(PyObject *m) +{ + Py_CLEAR(time_state(m)->StructTimeType); + return 0; +} + +static int +time_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(time_state(m)->StructTimeType); + return 0; +} + +static void +time_free(void *m) +{ + time_clear((PyObject *)m); +} + +static PyModuleDef timemodule; + +#define timestate_global ((timestate *)PyModule_GetState(PyState_FindModule(&timemodule))) + static PyObject * tmtotuple(struct tm *p) { - PyObject *v = PyStructSequence_New(&StructTimeType); + PyObject *v = PyStructSequence_New( + (PyTypeObject *)timestate_global->StructTimeType); if (v == NULL) return NULL; + Py_INCREF(timestate_global->StructTimeType); #define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val)) @@ -452,7 +484,7 @@ p->tm_wday = (p->tm_wday + 1) % 7; p->tm_yday--; #ifdef HAVE_STRUCT_TM_TM_ZONE - if (Py_TYPE(args) == &StructTimeType) { + if (Py_TYPE(args) == (PyTypeObject *)timestate_global->StructTimeType) { PyObject *item; item = PyTuple_GET_ITEM(args, 9); p->tm_zone = item == Py_None ? NULL : _PyUnicode_AsString(item); @@ -1437,28 +1469,35 @@ PyModuleDef_HEAD_INIT, "time", module_doc, - -1, + sizeof(timestate), time_methods, NULL, - NULL, - NULL, - NULL + time_traverse, + time_clear, + time_free }; PyMODINIT_FUNC PyInit_time(void) { PyObject *m; - m = PyModule_Create(&timemodule); - if (m == NULL) - return NULL; + + m = PyState_FindModule(&timemodule); + if(m == NULL) { + m = PyModule_Create(&timemodule); + if (m == NULL) + return NULL; + time_state(m)->initialized = 0; + } else { + Py_INCREF(m); + } /* Set, or reset, module variables like time.timezone */ PyInit_timezone(m); - if (!initialized) { - PyStructSequence_InitType(&StructTimeType, - &struct_time_type_desc); + if (!time_state(m)->initialized) { + time_state(m)->StructTimeType = + (PyObject *)PyStructSequence_NewType(&struct_time_type_desc); #ifdef MS_WINDOWS winver.dwOSVersionInfoSize = sizeof(winver); @@ -1469,14 +1508,14 @@ } #endif } - Py_INCREF(&StructTimeType); + Py_INCREF(time_state(m)->StructTimeType); #ifdef HAVE_STRUCT_TM_TM_ZONE PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11); #else PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 9); #endif - PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); - initialized = 1; + PyModule_AddObject(m, "struct_time", time_state(m)->StructTimeType); + time_state(m)->initialized = 1; return m; }