Patch 7.4.1404
Problem:    ch_read() doesn't time out on MS-Windows.
Solution:   Instead of WM_NETBEANS use select(). (Yukihiro Nakadaira)
Files:      src/channel.c, src/gui_w32.c, src/os_win32.c, src/structs.h,
            src/testdir/test_channel.vim, src/vim.h


*** ../vim-7.4.1403/src/channel.c       2016-02-23 17:13:56.873032372 +0100
--- src/channel.c       2016-02-23 19:25:12.687075841 +0100
***************
*** 52,61 ****
  # define fd_close(sd) close(sd)
  #endif
  
- #ifdef FEAT_GUI_W32
- extern HWND s_hwnd;                   /* Gvim's Window handle */
- #endif
- 
  #ifdef WIN32
      static int
  fd_read(sock_T fd, char *buf, size_t len)
--- 52,57 ----
***************
*** 296,304 ****
  #ifdef FEAT_GUI_GTK
        channel->ch_part[part].ch_inputHandler = 0;
  #endif
- #ifdef FEAT_GUI_W32
-       channel->ch_part[part].ch_inputHandler = -1;
- #endif
        channel->ch_part[part].ch_timeout = 2000;
      }
  
--- 292,297 ----
***************
*** 421,435 ****
                messageFromNetbeans,
                (gpointer)(long)channel->ch_part[part].ch_fd);
  #   endif
- #  else
- #   ifdef FEAT_GUI_W32
-     /* Tell Windows we are interested in receiving message when there
-      * is input on the editor connection socket.  */
-     if (channel->ch_part[part].ch_inputHandler == -1)
-       channel->ch_part[part].ch_inputHandler = WSAAsyncSelect(
-               channel->ch_part[part].ch_fd,
-               s_hwnd, WM_NETBEANS, FD_READ);
- #   endif
  #  endif
  # endif
  }
--- 414,419 ----
***************
*** 491,504 ****
  #   endif
            channel->ch_part[part].ch_inputHandler = 0;
        }
- #  else
- #   ifdef FEAT_GUI_W32
-       if (channel->ch_part[part].ch_inputHandler == 0)
-       {
-           WSAAsyncSelect(channel->ch_part[part].ch_fd, s_hwnd, 0, 0);
-           channel->ch_part[part].ch_inputHandler = -1;
-       }
- #   endif
  #  endif
  # endif
      }
--- 475,480 ----
***************
*** 1630,1636 ****
  /*
   * Check for reading from "fd" with "timeout" msec.
   * Return FAIL when there is nothing to read.
-  * Always returns OK for FEAT_GUI_W32.
   */
      static int
  channel_wait(channel_T *channel, sock_T fd, int timeout)
--- 1606,1611 ----
***************
*** 1662,1673 ****
      else
  #endif
      {
! #if defined(FEAT_GUI_W32)
!       /* Can't check socket for Win32 GUI, always return OK. */
!       ch_log(channel, "Can't check, assuming there is something to read");
!       return OK;
! #else
! # if defined(HAVE_SELECT)
        struct timeval  tval;
        fd_set          rfds;
        int                     ret;
--- 1637,1643 ----
      else
  #endif
      {
! #if defined(HAVE_SELECT)
        struct timeval  tval;
        fd_set          rfds;
        int                     ret;
***************
*** 1679,1701 ****
        for (;;)
        {
            ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
! #  ifdef EINTR
            SOCK_ERRNO;
            if (ret == -1 && errno == EINTR)
                continue;
! #  endif
            if (ret > 0)
                return OK;
            break;
        }
! # else
        struct pollfd   fds;
  
        fds.fd = fd;
        fds.events = POLLIN;
        if (poll(&fds, 1, timeout) > 0)
            return OK;
- # endif
  #endif
      }
      ch_log(channel, "Nothing to read");
--- 1649,1670 ----
        for (;;)
        {
            ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
! # ifdef EINTR
            SOCK_ERRNO;
            if (ret == -1 && errno == EINTR)
                continue;
! # endif
            if (ret > 0)
                return OK;
            break;
        }
! #else
        struct pollfd   fds;
  
        fds.fd = fd;
        fds.events = POLLIN;
        if (poll(&fds, 1, timeout) > 0)
            return OK;
  #endif
      }
      ch_log(channel, "Nothing to read");
***************
*** 1764,1779 ****
        if (len < MAXMSGSIZE)
            break;      /* did read everything that's available */
      }
- #ifdef FEAT_GUI_W32
-     if (use_socket && len == SOCKET_ERROR)
-     {
-       /* For Win32 GUI channel_wait() always returns OK and we handle the
-        * situation that there is nothing to read here.
-        * TODO: how about a timeout? */
-       if (WSAGetLastError() == WSAEWOULDBLOCK)
-           return;
-     }
- #endif
  
      /* Reading a disconnection (readlen == 0), or an error.
       * TODO: call error callback. */
--- 1733,1738 ----
***************
*** 1970,1986 ****
  
      for (channel = first_channel; channel != NULL; channel = channel->ch_next)
      {
! #  ifdef FEAT_GUI_W32
!       /* only check the pipes */
!       for (part = PART_OUT; part <= PART_ERR; ++part)
! #  else
! #   ifdef CHANNEL_PIPES
        /* check the socket and pipes */
        for (part = PART_SOCK; part <= PART_ERR; ++part)
! #   else
        /* only check the socket */
        part = PART_SOCK;
- #   endif
  #  endif
        {
            fd = channel->ch_part[part].ch_fd;
--- 1929,1940 ----
  
      for (channel = first_channel; channel != NULL; channel = channel->ch_next)
      {
! #  ifdef CHANNEL_PIPES
        /* check the socket and pipes */
        for (part = PART_SOCK; part <= PART_ERR; ++part)
! #  else
        /* only check the socket */
        part = PART_SOCK;
  #  endif
        {
            fd = channel->ch_part[part].ch_fd;
*** ../vim-7.4.1403/src/gui_w32.c       2016-02-21 17:20:51.179001562 +0100
--- src/gui_w32.c       2016-02-23 19:23:52.923917190 +0100
***************
*** 1927,1950 ****
      }
  #endif
  
- #ifdef FEAT_CHANNEL
-     if (msg.message == WM_NETBEANS)
-     {
-       int         part;
-       channel_T   *channel = channel_fd2channel((sock_T)msg.wParam, &part);
- 
-       if (channel != NULL)
-       {
-           /* Disable error messages, they can mess up the display and throw
-            * an exception. */
-           ++emsg_off;
-           channel_read(channel, part, "process_message");
-           --emsg_off;
-       }
-       return;
-     }
- #endif
- 
  #ifdef FEAT_SNIFF
      if (sniff_request_waiting && want_sniff_request)
      {
--- 1927,1932 ----
***************
*** 2245,2251 ****
        }
  
  #ifdef MESSAGE_QUEUE
!       parse_queued_messages();
  #endif
  
        /*
--- 2227,2244 ----
        }
  
  #ifdef MESSAGE_QUEUE
!       /* Check channel while waiting message. */
!       for (;;)
!       {
!           MSG msg;
! 
!           parse_queued_messages();
! 
!           if (pPeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)
!               || MsgWaitForMultipleObjects(0, NULL, FALSE, 100, QS_ALLEVENTS)
!                                                               != WAIT_TIMEOUT)
!               break;
!       }
  #endif
  
        /*
*** ../vim-7.4.1403/src/os_win32.c      2016-02-21 19:31:58.121130722 +0100
--- src/os_win32.c      2016-02-23 19:23:52.927917148 +0100
***************
*** 1492,1497 ****
--- 1492,1502 ----
        {
            DWORD dwWaitTime = dwEndTime - dwNow;
  
+ #ifdef FEAT_CHANNEL
+           /* Check channel while waiting input. */
+           if (dwWaitTime > 100)
+               dwWaitTime = 100;
+ #endif
  #ifdef FEAT_MZSCHEME
            if (mzthreads_allowed() && p_mzq > 0
                                    && (msec < 0 || (long)dwWaitTime > p_mzq))
*** ../vim-7.4.1403/src/structs.h       2016-02-23 17:13:56.885032246 +0100
--- src/structs.h       2016-02-23 19:23:52.927917148 +0100
***************
*** 1336,1344 ****
  #ifdef FEAT_GUI_GTK
      gint      ch_inputHandler; /* Cookie for input */
  #endif
- #ifdef WIN32
-     int               ch_inputHandler; /* ret.value of WSAAsyncSelect() */
- #endif
  
      ch_mode_T ch_mode;
      int               ch_timeout;     /* request timeout in msec */
--- 1336,1341 ----
*** ../vim-7.4.1403/src/testdir/test_channel.vim        2016-02-23 
13:20:18.466462173 +0100
--- src/testdir/test_channel.vim        2016-02-23 19:23:58.759855625 +0100
***************
*** 131,140 ****
      call assert_false(1, 's:responseHandle was not set')
    else
      call assert_equal(handle, s:responseHandle)
    endif
    call assert_equal('got it', s:responseMsg)
  
-   unlet s:responseHandle
    let s:responseMsg = ''
    call ch_sendexpr(handle, 'hello!', {'callback': 
function('s:RequestHandler')})
    sleep 10m
--- 131,140 ----
      call assert_false(1, 's:responseHandle was not set')
    else
      call assert_equal(handle, s:responseHandle)
+     unlet s:responseHandle
    endif
    call assert_equal('got it', s:responseMsg)
  
    let s:responseMsg = ''
    call ch_sendexpr(handle, 'hello!', {'callback': 
function('s:RequestHandler')})
    sleep 10m
***************
*** 142,147 ****
--- 142,148 ----
      call assert_false(1, 's:responseHandle was not set')
    else
      call assert_equal(handle, s:responseHandle)
+     unlet s:responseHandle
    endif
    call assert_equal('got it', s:responseMsg)
  
***************
*** 186,200 ****
    call assert_equal('ok', ch_sendexpr(handle, 'empty-request'))
  
    " Reading while there is nothing available.
!   " TODO: make this work for MS-Windows
!   if has('unix')
!     call assert_equal(v:none, ch_read(handle, {'timeout': 0}))
!     let start = reltime()
!     call assert_equal(v:none, ch_read(handle, {'timeout': 333}))
!     let elapsed = reltime(start)
!     call assert_true(reltimefloat(elapsed) > 0.3)
!     call assert_true(reltimefloat(elapsed) < 0.6)
!   endif
  
    " Send without waiting for a response, then wait for a response.
    call ch_sendexpr(handle, 'wait a bit',  {'callback': 0})
--- 187,198 ----
    call assert_equal('ok', ch_sendexpr(handle, 'empty-request'))
  
    " Reading while there is nothing available.
!   call assert_equal(v:none, ch_read(handle, {'timeout': 0}))
!   let start = reltime()
!   call assert_equal(v:none, ch_read(handle, {'timeout': 333}))
!   let elapsed = reltime(start)
!   call assert_true(reltimefloat(elapsed) > 0.3)
!   call assert_true(reltimefloat(elapsed) < 0.6)
  
    " Send without waiting for a response, then wait for a response.
    call ch_sendexpr(handle, 'wait a bit',  {'callback': 0})
*** ../vim-7.4.1403/src/vim.h   2016-02-23 14:52:31.901232005 +0100
--- src/vim.h   2016-02-23 19:23:58.763855583 +0100
***************
*** 1897,1906 ****
  #  ifdef FEAT_OLE
  #   define WM_OLE (WM_APP+0)
  #  endif
- #  ifdef FEAT_CHANNEL
-     /* message for channel socket event */
- #   define WM_NETBEANS (WM_APP+1)
- #  endif
  # endif
  
  /* Info about selected text */
--- 1897,1902 ----
*** ../vim-7.4.1403/src/version.c       2016-02-23 18:55:38.033647023 +0100
--- src/version.c       2016-02-23 19:23:17.352292457 +0100
***************
*** 750,751 ****
--- 750,753 ----
  {   /* Add new patch number below this line */
+ /**/
+     1404,
  /**/

-- 
Did you ever stop to think...  and forget to start again?
                                  -- Steven Wright

 /// Bram Moolenaar -- [email protected] -- 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui