On Sunday, February 14, 2016 at 11:02:55 PM UTC+1, Bram Moolenaar wrote:
> Patch 7.4.1319 (after 7.4.1318)
> Problem:    Tests fail on MS-Windows and on Unix with GUI.
> Solution:   Fix unregistering.
> Files:      src/structs.h, src/channel.c, src/os_unix.c, src/os_win32.c,
>             src/proto/channel.pro
> 
> 
> *** ../vim-7.4.1318/src/structs.h     2016-02-14 19:13:37.314808670 +0100
> --- src/structs.h     2016-02-14 21:48:58.429255434 +0100
> ***************
> *** 1301,1308 ****
>       MODE_JS
>   } ch_mode_T;
>   
> ! /* Ordering matters: IN is last, only SOCK/OUT/ERR are polled */
> ! 
>   #define CHAN_SOCK   0
>   #define CH_SOCK         ch_pfd[CHAN_SOCK].ch_fd
>   
> --- 1301,1308 ----
>       MODE_JS
>   } ch_mode_T;
>   
> ! /* Ordering matters, it is used in for loops: IN is last, only SOCK/OUT/ERR
> !  * are polled. */
>   #define CHAN_SOCK   0
>   #define CH_SOCK         ch_pfd[CHAN_SOCK].ch_fd
>   
> ***************
> *** 1342,1348 ****
>   
>       int             ch_id;          /* ID of the channel */
>   
> !     chan_fd_T       ch_pfd[4];      /* info for socket, in, out and err */
>   
>       readq_T ch_head;        /* dummy node, header for circular queue */
>   
> --- 1342,1348 ----
>   
>       int             ch_id;          /* ID of the channel */
>   
> !     chan_fd_T       ch_pfd[4];      /* info for socket, out, err and in */
>   
>       readq_T ch_head;        /* dummy node, header for circular queue */
>   
> ***************
> *** 1351,1356 ****
> --- 1351,1357 ----
>                                * the other side has exited, only mention the
>                                * first error until the connection works
>                                * again. */
> + 
>       void    (*ch_close_cb)(void); /* callback for when channel is closed */
>   
>       int             ch_block_id;    /* ID that channel_read_json_block() is
> *** ../vim-7.4.1318/src/channel.c     2016-02-14 19:13:37.318808628 +0100
> --- src/channel.c     2016-02-14 22:52:14.204212504 +0100
> ***************
> *** 339,346 ****
>        * is input on the editor connection socket. */
>       if (channel->ch_pfd[which].ch_inputHandler == 0)
>       channel->ch_pfd[which].ch_inputHandler = gdk_input_add(
> !             (gint)channel->ch_pfd[which].ch_fd, (GdkInputCondition)
> !             ((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION),
>               messageFromNetbeans,
>               (gpointer)(long)channel->ch_id);
>   #  else
> --- 339,347 ----
>        * is input on the editor connection socket. */
>       if (channel->ch_pfd[which].ch_inputHandler == 0)
>       channel->ch_pfd[which].ch_inputHandler = gdk_input_add(
> !             (gint)channel->ch_pfd[which].ch_fd,
> !             (GdkInputCondition)
> !                          ((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION),
>               messageFromNetbeans,
>               (gpointer)(long)channel->ch_id);
>   #  else
> ***************
> *** 362,373 ****
>       if (!CH_HAS_GUI)
>       return;
>   
> !     if (channel->ch_pfd[CHAN_SOCK].ch_fd >= 0)
>       channel_gui_register_one(channel, CHAN_SOCK);
>   # ifdef CHANNEL_PIPES
> !     if (channel->ch_pfd[CHAN_OUT].ch_fd >= 0)
>       channel_gui_register_one(channel, CHAN_OUT);
> !     if (channel->ch_pfd[CHAN_ERR].ch_fd >= 0)
>       channel_gui_register_one(channel, CHAN_ERR);
>   # endif
>   }
> --- 363,374 ----
>       if (!CH_HAS_GUI)
>       return;
>   
> !     if (channel->CH_SOCK >= 0)
>       channel_gui_register_one(channel, CHAN_SOCK);
>   # ifdef CHANNEL_PIPES
> !     if (channel->CH_OUT >= 0)
>       channel_gui_register_one(channel, CHAN_OUT);
> !     if (channel->CH_ERR >= 0)
>       channel_gui_register_one(channel, CHAN_ERR);
>   # endif
>   }
> ***************
> *** 386,429 ****
>   }
>   
>       static void
> ! channel_gui_unregister_one(channel_T *channel, int which)
>   {
> ! # ifdef FEAT_GUI_X11
> !     if (channel->ch_pfd[which].ch_inputHandler != (XtInputId)NULL)
>       {
> !     XtRemoveInput(channel->ch_pfd[which].ch_inputHandler);
> !     channel->ch_pfd[which].ch_inputHandler = (XtInputId)NULL;
> !     }
>   # else
>   #  ifdef FEAT_GUI_GTK
> !     if (channel->ch_pfd[which].ch_inputHandler != 0)
> !     {
> !     gdk_input_remove(channel->ch_pfd[which].ch_inputHandler);
> !     channel->ch_pfd[which].ch_inputHandler = 0;
> !     }
>   #  else
>   #   ifdef FEAT_GUI_W32
> !     if (channel->ch_pfd[which].ch_inputHandler == 0)
> !     {
> !     WSAAsyncSelect(channel->ch_pfd[which].ch_fd, s_hwnd, 0, 0);
> !     channel->ch_pfd[which].ch_inputHandler = -1;
> !     }
>   #   endif
>   #  endif
>   # endif
> ! }
> ! 
> !     static void
> ! channel_gui_unregister(channel_T *channel)
> ! {
> !     if (channel->ch_pfd[CHAN_SOCK].ch_fd >= 0)
> !     channel_gui_unregister_one(channel, CHAN_SOCK);
> ! # ifdef CHANNEL_PIPES
> !     if (channel->ch_pfd[CHAN_OUT].ch_fd >= 0)
> !     channel_gui_unregister_one(channel, CHAN_OUT);
> !     if (channel->ch_pfd[CHAN_ERR].ch_fd >= 0)
> !     channel_gui_unregister_one(channel, CHAN_ERR);
> ! # endif
>   }
>   
>   #endif
> --- 387,426 ----
>   }
>   
>       static void
> ! channel_gui_unregister(channel_T *channel)
>   {
> !     int         which;
> ! 
> ! #ifdef CHANNEL_PIPES
> !     for (which = CHAN_SOCK; which < CHAN_IN; ++which)
> ! #else
> !     which = CHAN_SOCK;
> ! #endif
>       {
> ! # ifdef FEAT_GUI_X11
> !     if (channel->ch_pfd[which].ch_inputHandler != (XtInputId)NULL)
> !     {
> !         XtRemoveInput(channel->ch_pfd[which].ch_inputHandler);
> !         channel->ch_pfd[which].ch_inputHandler = (XtInputId)NULL;
> !     }
>   # else
>   #  ifdef FEAT_GUI_GTK
> !     if (channel->ch_pfd[which].ch_inputHandler != 0)
> !     {
> !         gdk_input_remove(channel->ch_pfd[which].ch_inputHandler);
> !         channel->ch_pfd[which].ch_inputHandler = 0;
> !     }
>   #  else
>   #   ifdef FEAT_GUI_W32
> !     if (channel->ch_pfd[which].ch_inputHandler == 0)
> !     {
> !         WSAAsyncSelect(channel->ch_pfd[which].ch_fd, s_hwnd, 0, 0);
> !         channel->ch_pfd[which].ch_inputHandler = -1;
> !     }
>   #   endif
>   #  endif
>   # endif
> !     }
>   }
>   
>   #endif
> ***************
> *** 1192,1207 ****
>   {
>       ch_log(channel, "Closing channel");
>   
>       if (channel->CH_SOCK >= 0)
>       {
>       sock_close(channel->CH_SOCK);
>       channel->CH_SOCK = -1;
> -     channel->ch_close_cb = NULL;
> - #ifdef FEAT_GUI
> -     channel_gui_unregister(channel);
> - #endif
> -     vim_free(channel->ch_callback);
> -     channel->ch_callback = NULL;
>       }
>   #if defined(CHANNEL_PIPES)
>       if (channel->CH_IN >= 0)
> --- 1189,1202 ----
>   {
>       ch_log(channel, "Closing channel");
>   
> + #ifdef FEAT_GUI
> +     channel_gui_unregister(channel);
> + #endif
> + 
>       if (channel->CH_SOCK >= 0)
>       {
>       sock_close(channel->CH_SOCK);
>       channel->CH_SOCK = -1;
>       }
>   #if defined(CHANNEL_PIPES)
>       if (channel->CH_IN >= 0)
> ***************
> *** 1220,1225 ****
> --- 1215,1224 ----
>       channel->CH_ERR = -1;
>       }
>   #endif
> + 
> +     channel->ch_close_cb = NULL;
> +     vim_free(channel->ch_callback);
> +     channel->ch_callback = NULL;
>       channel_clear(channel);
>   }
>   
> ***************
> *** 1383,1389 ****
>   
>   /*
>    * Get the file descriptor to read from, either the socket or stdout.
> !  * TODO: never gets stderr.
>    */
>       static int
>   get_read_fd(channel_T *channel)
> --- 1382,1388 ----
>   
>   /*
>    * Get the file descriptor to read from, either the socket or stdout.
> !  * TODO: should have a way to read stderr.
>    */
>       static int
>   get_read_fd(channel_T *channel)
> ***************
> *** 1400,1406 ****
>   
>   /*
>    * Read from channel "channel" for as long as there is something to read.
> !  * "which" is CHAN_SOCK, CHAN_OUT or CHAN_ERR.  When -1 guess.
>    * The data is put in the read queue.
>    */
>       void
> --- 1399,1406 ----
>   
>   /*
>    * Read from channel "channel" for as long as there is something to read.
> !  * "which" is CHAN_SOCK, CHAN_OUT or CHAN_ERR.  When -1 use CHAN_SOCK or
> !  * CHAN_OUT, the one that is open.
>    * The data is put in the read queue.
>    */
>       void
> ***************
> *** 1475,1493 ****
>       ch_errors(channel, "%s(): Cannot read\n", func);
>       channel_save(channel, (char_u *)DETACH_MSG, (int)STRLEN(DETACH_MSG));
>   
> !     if (use_socket)
> !     {
> !         channel_close(channel);
> !         if (channel->ch_close_cb != NULL)
> !             (*channel->ch_close_cb)();
> !     }
> ! #if defined(CHANNEL_PIPES)
> !     else
> !     {
> !         close(fd);
> !         channel->CH_OUT = -1;
> !     }
> ! #endif
>   
>       if (len < 0)
>       {
> --- 1475,1486 ----
>       ch_errors(channel, "%s(): Cannot read\n", func);
>       channel_save(channel, (char_u *)DETACH_MSG, (int)STRLEN(DETACH_MSG));
>   
> !     /* TODO: When reading from stdout is not possible, should we try to
> !      * keep stdin and stderr open?  Probably not, assume the other side
> !      * has died. */
> !     channel_close(channel);
> !     if (channel->ch_close_cb != NULL)
> !         (*channel->ch_close_cb)();
>   
>       if (len < 0)
>       {
> ***************
> *** 1587,1592 ****
> --- 1580,1586 ----
>       if (fd >= 0)
>       for (channel = first_channel; channel != NULL;
>                                                  channel = channel->ch_next)
> +     {
>   #  ifdef CHANNEL_PIPES
>           for (i = CHAN_SOCK; i < CHAN_IN; ++i)
>   #  else
> ***************
> *** 1595,1602 ****
>               if (channel->ch_pfd[i].ch_fd == fd)
>               {
>                   *whichp = i;
> !                 return channel
>               }
>       return NULL;
>   }
>   # endif
> --- 1589,1597 ----
>               if (channel->ch_pfd[i].ch_fd == fd)
>               {
>                   *whichp = i;
> !                 return channel;
>               }
> +     }
>       return NULL;
>   }
>   # endif
> ***************
> *** 1638,1644 ****
>       {
>       ch_log_lead("SEND ", channel);
>       fprintf(log_fd, "'");
> !     ignored = fwrite(buf, len, 1, log_fd);
>       fprintf(log_fd, "'\n");
>       fflush(log_fd);
>       }
> --- 1633,1639 ----
>       {
>       ch_log_lead("SEND ", channel);
>       fprintf(log_fd, "'");
> !     ignored = (int)fwrite(buf, len, 1, log_fd);
>       fprintf(log_fd, "'\n");
>       fflush(log_fd);
>       }
> ***************
> *** 1677,1687 ****
> --- 1672,1684 ----
>       int             which;
>   
>       for (channel = first_channel; channel != NULL; channel = 
> channel->ch_next)
> +     {
>   #  ifdef CHANNEL_PIPES
>       for (which = CHAN_SOCK; which < CHAN_IN; ++which)
>   #  else
>       which = CHAN_SOCK;
>   #  endif
> +     {
>           if (channel->ch_pfd[which].ch_fd >= 0)
>           {
>               channel->ch_pfd[which].ch_poll_idx = nfd;
> ***************
> *** 1691,1696 ****
> --- 1688,1695 ----
>           }
>           else
>               channel->ch_pfd[which].ch_poll_idx = -1;
> +     }
> +     }
>   
>       return nfd;
>   }
> ***************
> *** 1707,1714 ****
>       int             which;
>   
>       for (channel = first_channel; channel != NULL; channel = 
> channel->ch_next)
>   #  ifdef CHANNEL_PIPES
> !     for (which = CHAN_SOCK; which < CHAN_IN; ++which)
>   #  else
>       which = CHAN_SOCK;
>   #  endif
> --- 1706,1714 ----
>       int             which;
>   
>       for (channel = first_channel; channel != NULL; channel = 
> channel->ch_next)
> +     {
>   #  ifdef CHANNEL_PIPES
> !     for (which = CHAN_SOCK; which < CH_IN; ++which)
>   #  else
>       which = CHAN_SOCK;
>   #  endif
> ***************
> *** 1721,1726 ****
> --- 1721,1727 ----
>               --ret;
>           }
>       }
> +     }
>   
>       return ret;
>   }
> ***************
> *** 1739,1744 ****
> --- 1740,1746 ----
>       int             which;
>   
>       for (channel = first_channel; channel != NULL; channel = 
> channel->ch_next)
> +     {
>   #  ifdef CHANNEL_PIPES
>       for (which = CHAN_SOCK; which < CHAN_IN; ++which)
>   #  else
> ***************
> *** 1754,1759 ****
> --- 1756,1762 ----
>                   maxfd = fd;
>           }
>       }
> +     }
>   
>       return maxfd;
>   }
> ***************
> *** 1770,1775 ****
> --- 1773,1779 ----
>       int             which;
>   
>       for (channel = first_channel; channel != NULL; channel = 
> channel->ch_next)
> +     {
>   #  ifdef CHANNEL_PIPES
>       for (which = CHAN_SOCK; which < CHAN_IN; ++which)
>   #  else
> ***************
> *** 1784,1789 ****
> --- 1788,1794 ----
>               --ret;
>           }
>       }
> +     }
>   
>       return ret;
>   }
> *** ../vim-7.4.1318/src/os_unix.c     2016-02-14 19:13:37.322808585 +0100
> --- src/os_unix.c     2016-02-14 22:10:26.847671765 +0100
> ***************
> *** 5043,5049 ****
>       int             fd_in[2];       /* for stdin */
>       int             fd_out[2];      /* for stdout */
>       int             fd_err[2];      /* for stderr */
> !     channel_T       *channel;
>   
>       /* default is to fail */
>       job->jv_status = JOB_FAILED;
> --- 5043,5049 ----
>       int             fd_in[2];       /* for stdin */
>       int             fd_out[2];      /* for stdout */
>       int             fd_err[2];      /* for stderr */
> !     channel_T       *channel = NULL;
>   
>       /* default is to fail */
>       job->jv_status = JOB_FAILED;
> *** ../vim-7.4.1318/src/os_win32.c    2016-02-14 19:13:37.322808585 +0100
> --- src/os_win32.c    2016-02-14 22:58:57.824939391 +0100
> ***************
> *** 5039,5051 ****
>       STARTUPINFO             si;
>       PROCESS_INFORMATION     pi;
>       HANDLE          jo;
> ! #ifdef FEAT_CHANNEL
> !     channel_T       *channel;
>   
>       channel = add_channel();
>       if (channel == NULL)
>       return;
> ! #endif
>   
>       jo = CreateJobObject(NULL, NULL);
>       if (jo == NULL)
> --- 5039,5051 ----
>       STARTUPINFO             si;
>       PROCESS_INFORMATION     pi;
>       HANDLE          jo;
> ! # ifdef FEAT_CHANNEL
> !     channel_T               *channel;
>   
>       channel = add_channel();
>       if (channel == NULL)
>       return;
> ! # endif
>   
>       jo = CreateJobObject(NULL, NULL);
>       if (jo == NULL)
> ***************
> *** 5085,5108 ****
>       job->jv_job_object = jo;
>       job->jv_status = JOB_STARTED;
>   
> ! #ifdef FEAT_CHANNEL
> ! # if 0
>       /* TODO: connect stdin/stdout/stderr */
>       job->jv_channel = channel;
>       channel_set_pipes(channel, fd_in[1], fd_out[0], fd_err[0]);
>       channel_set_job(channel, job);
>   
> ! #  ifdef FEAT_GUI
>        channel_gui_register(channel);
>   #  endif
>   # endif
> - #endif
>       return;
>   
>   failed:
> ! #ifdef FEAT_CHANNEL
>       channel_free(channel);
> ! #endif
>   }
>   
>       char *
> --- 5085,5108 ----
>       job->jv_job_object = jo;
>       job->jv_status = JOB_STARTED;
>   
> ! # ifdef FEAT_CHANNEL
> ! #  if 0
>       /* TODO: connect stdin/stdout/stderr */
>       job->jv_channel = channel;
>       channel_set_pipes(channel, fd_in[1], fd_out[0], fd_err[0]);
>       channel_set_job(channel, job);
>   
> ! #   ifdef FEAT_GUI
>        channel_gui_register(channel);
> + #   endif
>   #  endif
>   # endif
>       return;
>   
>   failed:
> ! # ifdef FEAT_CHANNEL
>       channel_free(channel);
> ! # endif
>   }
>   
>       char *
> *** ../vim-7.4.1318/src/proto/channel.pro     2016-02-14 19:13:37.326808543 
> +0100
> --- src/proto/channel.pro     2016-02-14 22:46:13.605009553 +0100
> ***************
> *** 22,31 ****
>   void channel_clear(channel_T *channel);
>   void channel_free_all(void);
>   int channel_get_id(void);
> ! void channel_read(channel_T *channel, int what, char *func);
>   char_u *channel_read_block(channel_T *channel);
>   int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
> ! channel_T *channel_fd2channel(sock_T fd, int *what);
>   int channel_send(channel_T *channel, char_u *buf, char *fun);
>   int channel_poll_setup(int nfd_in, void *fds_in);
>   int channel_poll_check(int ret_in, void *fds_in);
> --- 22,31 ----
>   void channel_clear(channel_T *channel);
>   void channel_free_all(void);
>   int channel_get_id(void);
> ! void channel_read(channel_T *channel, int which, char *func);
>   char_u *channel_read_block(channel_T *channel);
>   int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
> ! channel_T *channel_fd2channel(sock_T fd, int *whichp);
>   int channel_send(channel_T *channel, char_u *buf, char *fun);
>   int channel_poll_setup(int nfd_in, void *fds_in);
>   int channel_poll_check(int ret_in, void *fds_in);
> *** ../vim-7.4.1318/src/version.c     2016-02-14 19:13:37.326808543 +0100
> --- src/version.c     2016-02-14 20:45:01.705422355 +0100
> ***************
> *** 749,750 ****
> --- 749,752 ----
>   {   /* Add new patch number below this line */
> + /**/
> +     1319,
>   /**/
> 
> -- 
> hundred-and-one symptoms of being an internet addict:
> 255. You work for a newspaper and your editor asks you to write an
>      article about Internet addiction...in the "first person."
> 
>  /// 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    ///

os_win32.c:5102:1: error: label at end of compound statement
 failed:
 ^
Had to add an empty statement, i.e. ";", to fix this.

-- 
-- 
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