]> granicus.if.org Git - python/commitdiff
Merged revisions 64685 via svnmerge from
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Wed, 2 Jul 2008 23:44:19 +0000 (23:44 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Wed, 2 Jul 2008 23:44:19 +0000 (23:44 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r64685 | amaury.forgeotdarc | 2008-07-03 01:40:28 +0200 (Thu, 03 Jul 2008) | 3 lines

  Try a blind fix to nismodule which fails on the solaris10 3.0 buildbot:
  the GIL must be re-acquired in the callback function
........

Modules/nismodule.c

index 3af394d612ae6117d1ab2a03a4b808edf121cede..c2646ebfc6285b7e444c77c57510e5b22e270f8a 100644 (file)
@@ -98,6 +98,7 @@ typedef int (*foreachfunc)(int, char *, int, char *, int, char *);
 struct ypcallback_data {
        PyObject        *dict;
        int                     fix;
+       PyThreadState *state;
 };
 
 static int
@@ -109,6 +110,7 @@ nis_foreach (int instatus, char *inkey, int inkeylen, char *inval,
                PyObject *val;
                int err;
 
+               PyEval_RestoreThread(indata->state);
                if (indata->fix) {
                    if (inkeylen > 0 && inkey[inkeylen-1] == '\0')
                        inkeylen--;
@@ -127,10 +129,11 @@ nis_foreach (int instatus, char *inkey, int inkeylen, char *inval,
                err = PyDict_SetItem(indata->dict, key, val);
                Py_DECREF(key);
                Py_DECREF(val);
-               if (err != 0) {
+               if (err != 0)
                        PyErr_Clear();
-                       return 1;
-               }
+               indata->state = PyEval_SaveThread();
+               if (err != 0)
+                       return 1;
                return 0;
        }
        return 1;
@@ -206,9 +209,9 @@ nis_cat (PyObject *self, PyObject *args, PyObject *kwdict)
        data.dict = dict;
        map = nis_mapname (map, &data.fix);
        cb.data = (char *)&data;
-       Py_BEGIN_ALLOW_THREADS
+       data.state = PyEval_SaveThread();
        err = yp_all (domain, map, &cb);
-       Py_END_ALLOW_THREADS
+       PyEval_RestoreThread(data.state);
        if (err != 0) {
                Py_DECREF(dict);
                return nis_error(err);