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 <