diff --git a/7.3.808 b/7.3.808 new file mode 100644 index 0000000..a63e773 --- /dev/null +++ b/7.3.808 @@ -0,0 +1,289 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.808 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.808 +Problem: Python threads still do not work properly. +Solution: Fix both Python 2 and 3. Add tests. (Ken Takata) +Files: src/if_python.c, src/if_python3.c, src/testdir/test86.in, + src/testdir/test86.ok, src/testdir/test87.in, + src/testdir/test87.ok + + +*** ../vim-7.3.807/src/if_python.c 2013-01-30 11:44:33.000000000 +0100 +--- src/if_python.c 2013-02-13 14:07:28.000000000 +0100 +*************** +*** 741,747 **** + PyMac_Initialize(); + #endif + /* Initialise threads, and below save the state using +! * PyGILState_Ensure. Without the call to PyGILState_Ensure, thread + * specific state (such as the system trace hook), will be lost + * between invocations of Python code. */ + PyEval_InitThreads(); +--- 741,747 ---- + PyMac_Initialize(); + #endif + /* Initialise threads, and below save the state using +! * PyEval_SaveThread. Without the call to PyEval_SaveThread, thread + * specific state (such as the system trace hook), will be lost + * between invocations of Python code. */ + PyEval_InitThreads(); +*************** +*** 755,764 **** + if (PythonMod_Init()) + goto fail; + +- /* The first python thread is vim's, release the lock. */ +- Python_SaveThread(); +- pygilstate = PyGILState_Ensure(); +- + globals = PyModule_GetDict(PyImport_AddModule("__main__")); + + /* Remove the element from sys.path that was added because of our +--- 755,760 ---- +*************** +*** 767,773 **** + * the current directory in sys.path. */ + PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); + +! PyGILState_Release(pygilstate); + + initialised = 1; + } +--- 763,776 ---- + * the current directory in sys.path. */ + PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); + +! /* lock is created and acquired in PyEval_InitThreads() and thread +! * state is created in Py_Initialize() +! * there _PyGILState_NoteThreadState() also sets gilcounter to 1 +! * (python must have threads enabled!) +! * so the following does both: unlock GIL and save thread state in TLS +! * without deleting thread state +! */ +! PyEval_SaveThread(); + + initialised = 1; + } +*** ../vim-7.3.807/src/if_python3.c 2012-11-28 15:33:10.000000000 +0100 +--- src/if_python3.c 2013-02-13 14:07:28.000000000 +0100 +*************** +*** 729,741 **** + #else + PyMac_Initialize(); + #endif +! /* Initialise threads, and save the state using PyGILState_Ensure. +! * Without the call to PyGILState_Ensure, thread specific state (such +! * as the system trace hook), will be lost between invocations of +! * Python code. */ + PyEval_InitThreads(); +- pygilstate = PyGILState_Ensure(); +- + #ifdef DYNAMIC_PYTHON3 + get_py3_exceptions(); + #endif +--- 729,739 ---- + #else + PyMac_Initialize(); + #endif +! /* Initialise threads, and below save the state using +! * PyEval_SaveThread. Without the call to PyEval_SaveThread, thread +! * specific state (such as the system trace hook), will be lost +! * between invocations of Python code. */ + PyEval_InitThreads(); + #ifdef DYNAMIC_PYTHON3 + get_py3_exceptions(); + #endif +*************** +*** 754,766 **** + */ + PyRun_SimpleString("import vim; import sys; sys.path = list(filter(lambda x: not x.endswith('must>not&exist'), sys.path))"); + +! // lock is created and acquired in PyEval_InitThreads() and thread +! // state is created in Py_Initialize() +! // there _PyGILState_NoteThreadState() also sets gilcounter to 1 +! // (python must have threads enabled!) +! // so the following does both: unlock GIL and save thread state in TLS +! // without deleting thread state +! PyGILState_Release(pygilstate); + + py3initialised = 1; + } +--- 752,765 ---- + */ + PyRun_SimpleString("import vim; import sys; sys.path = list(filter(lambda x: not x.endswith('must>not&exist'), sys.path))"); + +! /* lock is created and acquired in PyEval_InitThreads() and thread +! * state is created in Py_Initialize() +! * there _PyGILState_NoteThreadState() also sets gilcounter to 1 +! * (python must have threads enabled!) +! * so the following does both: unlock GIL and save thread state in TLS +! * without deleting thread state +! */ +! PyEval_SaveThread(); + + py3initialised = 1; + } +*** ../vim-7.3.807/src/testdir/test86.in 2012-09-21 14:00:05.000000000 +0200 +--- src/testdir/test86.in 2013-02-13 13:58:25.000000000 +0100 +*************** +*** 267,272 **** +--- 267,320 ---- + : $put =toput + : endtry + :endfor ++ :" ++ :" threading ++ :let l = [0] ++ :py l=vim.bindeval('l') ++ :py < 8 # check if the background thread is working ++ :$put =string(l) ++ :" ++ :" settrace ++ :let l = [] ++ :py l=vim.bindeval('l') ++ :py < 8 # check if the background thread is working ++ :$put =string(l) ++ :" ++ :" settrace ++ :let l = [] ++ :py3 l=vim.bindeval('l') ++ :py3 <