summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/if_py_both.h7
-rw-r--r--src/if_python.c33
-rw-r--r--src/if_python3.c5
-rw-r--r--src/version.c2
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
@@ -729,6 +729,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 956,
+/**/
955,
/**/
954,