diff -r 86c96f187eed Modules/fpetestmodule.c --- a/Modules/fpetestmodule.c Thu Aug 16 10:29:34 2012 +0200 +++ b/Modules/fpetestmodule.c Thu Aug 16 10:36:06 2012 +0200 @@ -43,7 +43,37 @@ #include "Python.h" -static PyObject *fpe_error; +typedef struct { + PyObject *fpe_error; +} fpeteststate; + + +#define fpetest_state(o) ((fpeteststate *)PyModule_GetState(o)) + +static int +fpetest_clear(PyObject *m) +{ + Py_CLEAR(fpetest_state(m)->fpe_error); + return 0; +} + +static int +fpetest_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(fpetest_state(m)->fpe_error); + return 0; +} + +static void +fpetest_free(void *m) +{ + fpetest_clear((PyObject *)m); +} + +static PyModuleDef fpetestmodule; + +#define fpeteststate_global ((fpeteststate *)PyModule_GetState(PyState_FindModule(&fpetestmodule))) + PyMODINIT_FUNC PyInit_fpetest(void); static PyObject *test(PyObject *self,PyObject *args); @@ -177,12 +207,12 @@ PyModuleDef_HEAD_INIT, "fpetest", NULL, - -1, + sizeof(fpeteststate), fpetest_methods, NULL, - NULL, - NULL, - NULL + fpetest_traverse, + fpetest_clear, + fpetest_free }; PyMODINIT_FUNC PyInit_fpetest(void) @@ -191,10 +221,10 @@ m = PyModule_Create(&fpetestmodule); if (m == NULL) - return NULL; + return NULL; d = PyModule_GetDict(m); - fpe_error = PyErr_NewException("fpetest.error", NULL, NULL); - if (fpe_error != NULL) - PyDict_SetItemString(d, "error", fpe_error); + fpetest_state(m)->fpe_error = PyErr_NewException("fpetest.error", NULL, NULL); + if (fpetest_state(m)->fpe_error != NULL) + PyDict_SetItemString(d, "error", fpetest_state(m)->fpe_error); return m; }