diff -r 41fd36f8f3ec Modules/nismodule.c --- a/Modules/nismodule.c Thu Aug 16 10:59:31 2012 +0200 +++ b/Modules/nismodule.c Thu Aug 16 11:05:50 2012 +0200 @@ -44,12 +44,42 @@ Returns an array of all available NIS maps within a domain. If domain\n\ is not specified it defaults to the system default domain.\n"); -static PyObject *NisError; +typedef struct { + PyObject *NisError; +} nisstate; + + +#define nis_state(o) ((nisstate *)PyModule_GetState(o)) + +static int +nis_clear(PyObject *m) +{ + Py_CLEAR(nis_state(m)->NisError); + return 0; +} + +static int +nis_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(nis_state(m)->NisError); + return 0; +} + +static void +nis_free(void *m) +{ + nis_clear((PyObject *)m); +} + +static PyModuleDef nismodule; + +#define nisstate_global ((nisstate *)PyModule_GetState(PyState_FindModule(&nismodule))) + static PyObject * nis_error (int err) { - PyErr_SetString(NisError, yperr_string(err)); + PyErr_SetString(nisstate_global->NisError, yperr_string(err)); return NULL; } @@ -367,12 +397,12 @@ mapi++; } if (!server) { - PyErr_SetString(NisError, "No NIS master found for any map"); + PyErr_SetString(nisstate_global->NisError, "No NIS master found for any map"); return NULL; } cl = clnt_create(server, YPPROG, YPVERS, "tcp"); if (cl == NULL) { - PyErr_SetString(NisError, clnt_spcreateerror(server)); + PyErr_SetString(nisstate_global->NisError, clnt_spcreateerror(server)); goto finally; } list = nisproc_maplist_2 (&dom, cl); @@ -448,12 +478,12 @@ PyModuleDef_HEAD_INIT, "nis", nis__doc__, - -1, + sizeof(nisstate), nis_methods, NULL, - NULL, - NULL, - NULL + nis_traverse, + nis_clear, + nis_free }; PyObject* @@ -464,8 +494,10 @@ if (m == NULL) return NULL; d = PyModule_GetDict(m); - NisError = PyErr_NewException("nis.error", NULL, NULL); - if (NisError != NULL) - PyDict_SetItemString(d, "error", NisError); + + nis_state(m)->NisError = PyErr_NewException("nis.error", NULL, NULL); + if (nis_state(m)->NisError != NULL) + PyDict_SetItemString(d, "error", nis_state(m)->NisError); + return m; }