]> granicus.if.org Git - python/commitdiff
Darn. When thread support is disabled, the BEGIN/END macros don't
authorGuido van Rossum <guido@python.org>
Fri, 10 Oct 1997 17:39:19 +0000 (17:39 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 10 Oct 1997 17:39:19 +0000 (17:39 +0000)
save and restore the tstate, but explicitly calling
PyEval_SaveThread() does reset it!  While I think about how to fix
this for real, here's a fix that avoids getting a fatal error.

Modules/_tkinter.c
Modules/readline.c

index 593b057a63be3a1d0ee2a91ac83206a90eb0b88c..59587164f2a6e16eb9971ca8dd3980ba4dabedaa 100644 (file)
@@ -1456,14 +1456,15 @@ static PyInterpreterState *event_interp = NULL;
 static int
 EventHook()
 {
-       PyThreadState *tstate;
+       PyThreadState *tstate, *save_tstate;
 
        if (Tk_GetNumMainWindows() == 0)
                return 0;
        if (event_interp == NULL)
                return 0;
        tstate = PyThreadState_New(event_interp);
-       PyEval_AcquireThread(tstate);
+       save_tstate = PyThreadState_Swap(NULL);
+       PyEval_RestoreThread(tstate);
        if (!errorInCmd)
                Tcl_DoOneEvent(TCL_DONT_WAIT);
        if (errorInCmd) {
@@ -1473,7 +1474,8 @@ EventHook()
                PyErr_Print();
        }
        PyThreadState_Clear(tstate);
-       PyEval_ReleaseThread(tstate);
+       PyEval_SaveThread();
+       PyThreadState_Swap(save_tstate);
        PyThreadState_Delete(tstate);
        return 0;
 }
@@ -1536,7 +1538,6 @@ init_tkinter()
        PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type);
 
        if (PyOS_InputHook == NULL) {
-               PyEval_InitThreads();
                event_interp = PyThreadState_Get()->interp;
                PyOS_InputHook = EventHook;
        }
index 1231e034cb995c4508a5fa93c2a13c7c446cd4fa..e12ae1d70e91bfac6b4cc127f1bdde877235b50c 100644 (file)
@@ -168,8 +168,10 @@ on_completion(text, state)
        char *result = NULL;
        if (completer != NULL) {
                PyObject *r;
+               PyThreadState *save_tstate;
                /* Note that readline is called with the interpreter
                   lock released! */
+               save_tstate = PyThreadState_Swap(NULL);
                PyEval_RestoreThread(tstate);
                r = PyObject_CallFunction(completer, "si", text, state);
                if (r == NULL)
@@ -190,6 +192,7 @@ on_completion(text, state)
                Py_XDECREF(r);
          done:
                PyEval_SaveThread();
+               PyThreadState_Swap(save_tstate);
        }
        return result;
 }