From 71700b8903a8ccd172ae739f53520b59fc153bca Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 15 May 2013 17:49:05 +0200 Subject: updated for version 7.3.956 Problem: Python vim.bindeval() causes SIGABRT. Solution: Make pygilstate a local variable. (Yukihiro Nakadaira) --- src/if_py_both.h | 7 +++++++ src/if_python.c | 33 +++++++++++++++++++++------------ src/if_python3.c | 5 ++--- src/version.c | 2 ++ 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/if_py_both.h b/src/if_py_both.h index 4905bed68..2fef1e426 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -1298,7 +1298,14 @@ FunctionCall(PyObject *self, PyObject *argsObject, PyObject *kwargs) } } + Py_BEGIN_ALLOW_THREADS + Python_Lock_Vim(); + error = func_call(name, &args, selfdict, &rettv); + + Python_Release_Vim(); + Py_END_ALLOW_THREADS + if (error != OK) { result = NULL; diff --git a/src/if_python.c b/src/if_python.c index 1c1924549..134e7f932 100644 --- a/src/if_python.c +++ b/src/if_python.c @@ -676,11 +676,8 @@ static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, PyInt *); typedef PyObject PyThreadState; #endif -#ifdef PY_CAN_RECURSE -static PyGILState_STATE pygilstate = PyGILState_UNLOCKED; -#else +#ifndef PY_CAN_RECURSE static PyThreadState *saved_python_thread = NULL; -#endif /* * Suspend a thread of the Python interpreter, other threads are allowed to @@ -689,11 +686,7 @@ static PyThreadState *saved_python_thread = NULL; static void Python_SaveThread(void) { -#ifdef PY_CAN_RECURSE - PyGILState_Release(pygilstate); -#else saved_python_thread = PyEval_SaveThread(); -#endif } /* @@ -703,13 +696,10 @@ Python_SaveThread(void) static void Python_RestoreThread(void) { -#ifdef PY_CAN_RECURSE - pygilstate = PyGILState_Ensure(); -#else PyEval_RestoreThread(saved_python_thread); saved_python_thread = NULL; -#endif } +#endif void python_end() @@ -725,14 +715,22 @@ python_end() #ifdef DYNAMIC_PYTHON if (hinstPython && Py_IsInitialized()) { +# ifdef PY_CAN_RECURSE + PyGILState_Ensure(); +# else Python_RestoreThread(); /* enter python */ +# endif Py_Finalize(); } end_dynamic_python(); #else if (Py_IsInitialized()) { +# ifdef PY_CAN_RECURSE + PyGILState_Ensure(); +# else Python_RestoreThread(); /* enter python */ +# endif Py_Finalize(); } #endif @@ -837,6 +835,9 @@ DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv) #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) char *saved_locale; #endif +#ifdef PY_CAN_RECURSE + PyGILState_STATE pygilstate; +#endif #ifndef PY_CAN_RECURSE if (recursive) @@ -881,7 +882,11 @@ DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv) } #endif +#ifdef PY_CAN_RECURSE + pygilstate = PyGILState_Ensure(); +#else Python_RestoreThread(); /* enter python */ +#endif if (rettv == NULL) PyRun_SimpleString((char *)(cmd)); @@ -905,7 +910,11 @@ DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv) PyErr_Clear(); } +#ifdef PY_CAN_RECURSE + PyGILState_Release(pygilstate); +#else Python_SaveThread(); /* leave python */ +#endif #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) if (saved_locale != NULL) diff --git a/src/if_python3.c b/src/if_python3.c index 2f98a0462..daf517f77 100644 --- a/src/if_python3.c +++ b/src/if_python3.c @@ -699,8 +699,6 @@ static PyObject *Py3Init_vim(void); * 1. Python interpreter main program. */ -static PyGILState_STATE pygilstate = PyGILState_UNLOCKED; - void python3_end() { @@ -718,7 +716,7 @@ python3_end() if (Py_IsInitialized()) { // acquire lock before finalizing - pygilstate = PyGILState_Ensure(); + PyGILState_Ensure(); Py_Finalize(); } @@ -826,6 +824,7 @@ DoPy3Command(exarg_T *eap, const char *cmd, typval_T *rettv) #endif PyObject *cmdstr; PyObject *cmdbytes; + PyGILState_STATE pygilstate; #if defined(MACOS) && !defined(MACOS_X_UNIX) GetPort(&oldPort); diff --git a/src/version.c b/src/version.c index b99117bad..c7cb1fa4c 100644 --- a/src/version.c +++ b/src/version.c @@ -728,6 +728,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 956, /**/ 955, /**/ -- cgit v1.2.1