Loading ...
Sorry, an error occurred while loading the content.
 

Patch 7.3.808

Expand Messages
  • Bram Moolenaar
    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,
    Message 1 of 1 , Feb 13, 2013
      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 <<EOF
      + import threading
      + import time
      +
      + class T(threading.Thread):
      + def __init__(self):
      + threading.Thread.__init__(self)
      + self.t = 0
      + self.running = True
      +
      + def run(self):
      + while self.running:
      + self.t += 1
      + time.sleep(0.1)
      +
      + t = T()
      + t.start()
      + EOF
      + :sleep 1
      + :py t.running = False
      + :py t.join()
      + :py l[0] = t.t > 8 # check if the background thread is working
      + :$put =string(l)
      + :"
      + :" settrace
      + :let l = []
      + :py l=vim.bindeval('l')
      + :py <<EOF
      + import sys
      +
      + def traceit(frame, event, arg):
      + global l
      + if event == "line":
      + l.extend([frame.f_lineno])
      + return traceit
      +
      + def trace_main():
      + for i in range(5):
      + pass
      + EOF
      + :py sys.settrace(traceit)
      + :py trace_main()
      + :py sys.settrace(None)
      + :$put =string(l)
      :endfun
      :"
      :call Test()
      *** ../vim-7.3.807/src/testdir/test86.ok 2012-09-21 14:00:05.000000000 +0200
      --- src/testdir/test86.ok 2013-02-13 13:58:25.000000000 +0100
      ***************
      *** 63,65 ****
      --- 63,67 ----
      {"\0": 1}: Vim(let):E859:
      undefined_name: Vim(let):E858:
      vim: Vim(let):E859:
      + [1]
      + [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
      *** ../vim-7.3.807/src/testdir/test87.in 2012-09-21 14:00:05.000000000 +0200
      --- src/testdir/test87.in 2013-02-13 13:58:25.000000000 +0100
      ***************
      *** 267,272 ****
      --- 267,320 ----
      : $put =toput
      : endtry
      :endfor
      + :"
      + :" threading
      + :let l = [0]
      + :py3 l=vim.bindeval('l')
      + :py3 <<EOF
      + import threading
      + import time
      +
      + class T(threading.Thread):
      + def __init__(self):
      + threading.Thread.__init__(self)
      + self.t = 0
      + self.running = True
      +
      + def run(self):
      + while self.running:
      + self.t += 1
      + time.sleep(0.1)
      +
      + t = T()
      + t.start()
      + EOF
      + :sleep 1
      + :py3 t.running = False
      + :py3 t.join()
      + :py3 l[0] = t.t > 8 # check if the background thread is working
      + :$put =string(l)
      + :"
      + :" settrace
      + :let l = []
      + :py3 l=vim.bindeval('l')
      + :py3 <<EOF
      + import sys
      +
      + def traceit(frame, event, arg):
      + global l
      + if event == "line":
      + l += [frame.f_lineno]
      + return traceit
      +
      + def trace_main():
      + for i in range(5):
      + pass
      + EOF
      + :py3 sys.settrace(traceit)
      + :py3 trace_main()
      + :py3 sys.settrace(None)
      + :$put =string(l)
      :endfun
      :"
      :call Test()
      *** ../vim-7.3.807/src/testdir/test87.ok 2012-09-21 14:00:05.000000000 +0200
      --- src/testdir/test87.ok 2013-02-13 13:58:25.000000000 +0100
      ***************
      *** 63,65 ****
      --- 63,67 ----
      {"\0": 1}: Vim(let):E861:
      undefined_name: Vim(let):E860:
      vim: Vim(let):E861:
      + [1]
      + [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
      *** ../vim-7.3.807/src/version.c 2013-02-13 12:15:59.000000000 +0100
      --- src/version.c 2013-02-13 14:10:53.000000000 +0100
      ***************
      *** 727,728 ****
      --- 727,730 ----
      { /* Add new patch number below this line */
      + /**/
      + 808,
      /**/

      --
      Lawmakers made it obligatory for everybody to take at least one bath
      each week -- on Saturday night.
      [real standing law in Vermont, United States of America]

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ an exciting new programming language -- http://www.Zimbu.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

      --
      --
      You received this message from the "vim_dev" maillist.
      Do not top-post! Type your reply below the text you are replying to.
      For more information, visit http://www.vim.org/maillist.php

      ---
      You received this message because you are subscribed to the Google Groups "vim_dev" group.
      To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
      For more options, visit https://groups.google.com/groups/opt_out.
    Your message has been successfully submitted and would be delivered to recipients shortly.