Skip to content

Commit 7707344

Browse files
committed
patch 7.4.1315
Problem: Using a channel handle does not allow for freeing it when unused. Solution: Add the Channel variable type.
1 parent e516c39 commit 7707344

14 files changed

Lines changed: 716 additions & 571 deletions

File tree

src/channel.c

Lines changed: 459 additions & 425 deletions
Large diffs are not rendered by default.

src/eval.c

Lines changed: 151 additions & 66 deletions
Large diffs are not rendered by default.

src/gui_w48.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,14 +1780,14 @@ process_message(void)
17801780
#ifdef FEAT_CHANNEL
17811781
if (msg.message == WM_NETBEANS)
17821782
{
1783-
int channel_idx = channel_fd2idx((sock_T)msg.wParam);
1783+
channel_T *channel = channel_fd2channel((sock_T)msg.wParam);
17841784

1785-
if (channel_idx >= 0)
1785+
if (channel != NULL)
17861786
{
17871787
/* Disable error messages, they can mess up the display and throw
17881788
* an exception. */
17891789
++emsg_off;
1790-
channel_read(channel_idx, FALSE, "process_message");
1790+
channel_read(channel, FALSE, "process_message");
17911791
--emsg_off;
17921792
}
17931793
return;

src/if_python.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,7 @@ do_pyeval (char_u *str, typval_T *rettv)
15611561
case VAR_FLOAT:
15621562
case VAR_SPECIAL:
15631563
case VAR_JOB:
1564+
case VAR_CHANNEL:
15641565
break;
15651566
}
15661567
}

src/if_python3.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,7 @@ do_py3eval (char_u *str, typval_T *rettv)
16541654
case VAR_FLOAT:
16551655
case VAR_SPECIAL:
16561656
case VAR_JOB:
1657+
case VAR_CHANNEL:
16571658
break;
16581659
}
16591660
}

src/json.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options)
183183

184184
case VAR_FUNC:
185185
case VAR_JOB:
186+
case VAR_CHANNEL:
186187
/* no JSON equivalent TODO: better error */
187188
EMSG(_(e_invarg));
188189
return FAIL;

src/misc2.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,6 +1138,9 @@ free_all_mem(void)
11381138
# endif
11391139
# ifdef FEAT_DIFF
11401140
diff_clear(curtab);
1141+
# endif
1142+
# ifdef FEAT_CHANNEL
1143+
channel_free_all();
11411144
# endif
11421145
clear_sb_text(); /* free any scrollback text */
11431146

src/netbeans.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ static int nb_do_cmd(int, char_u *, int, int, char_u *);
6363
static void nb_send(char *buf, char *fun);
6464
static void nb_free(void);
6565

66-
#define NETBEANS_OPEN (nb_channel_idx >= 0 && channel_is_open(nb_channel_idx))
67-
static int nb_channel_idx = -1;
66+
#define NETBEANS_OPEN (channel_can_write_to(nb_channel))
67+
static channel_T *nb_channel = NULL;
6868

6969
static int r_cmdno; /* current command number for reply */
7070
static int dosetvisible = FALSE;
@@ -85,7 +85,7 @@ static int inAtomic = 0;
8585
static void
8686
nb_channel_closed(void)
8787
{
88-
nb_channel_idx = -1;
88+
nb_channel = NULL;
8989
}
9090

9191
/*
@@ -98,10 +98,10 @@ netbeans_close(void)
9898
if (NETBEANS_OPEN)
9999
{
100100
netbeans_send_disconnect();
101-
if (nb_channel_idx >= 0)
101+
if (nb_channel != NULL)
102102
/* Close the socket and remove the input handlers. */
103-
channel_close(nb_channel_idx);
104-
nb_channel_idx = -1;
103+
channel_close(nb_channel);
104+
nb_channel = NULL;
105105
}
106106

107107
#ifdef FEAT_BEVAL
@@ -213,8 +213,8 @@ netbeans_connect(char *params, int doabort)
213213
if (hostname != NULL && address != NULL && password != NULL)
214214
{
215215
port = atoi(address);
216-
nb_channel_idx = channel_open(hostname, port, 0, nb_channel_closed);
217-
if (nb_channel_idx >= 0)
216+
nb_channel = channel_open(hostname, port, 0, nb_channel_closed);
217+
if (nb_channel != NULL)
218218
{
219219
/* success */
220220
# ifdef FEAT_BEVAL
@@ -230,7 +230,7 @@ netbeans_connect(char *params, int doabort)
230230
}
231231
}
232232

233-
if (nb_channel_idx < 0 && doabort)
233+
if (nb_channel == NULL && doabort)
234234
getout(1);
235235

236236
vim_free(hostname);
@@ -383,9 +383,9 @@ netbeans_parse_messages(void)
383383
char_u *p;
384384
int own_node;
385385

386-
while (nb_channel_idx >= 0)
386+
while (nb_channel != NULL)
387387
{
388-
buffer = channel_peek(nb_channel_idx);
388+
buffer = channel_peek(nb_channel);
389389
if (buffer == NULL)
390390
break; /* nothing to read */
391391

@@ -396,7 +396,7 @@ netbeans_parse_messages(void)
396396
/* Command isn't complete. If there is no following buffer,
397397
* return (wait for more). If there is another buffer following,
398398
* prepend the text to that buffer and delete this one. */
399-
if (channel_collapse(nb_channel_idx) == FAIL)
399+
if (channel_collapse(nb_channel) == FAIL)
400400
return;
401401
}
402402
else
@@ -409,7 +409,7 @@ netbeans_parse_messages(void)
409409
if (*p == NUL)
410410
{
411411
own_node = TRUE;
412-
channel_get(nb_channel_idx);
412+
channel_get(nb_channel);
413413
}
414414
else
415415
own_node = FALSE;
@@ -600,8 +600,8 @@ nb_free(void)
600600
}
601601

602602
/* free the queued netbeans commands */
603-
if (nb_channel_idx >= 0)
604-
channel_clear(nb_channel_idx);
603+
if (nb_channel != NULL)
604+
channel_clear(nb_channel);
605605
}
606606

607607
/*
@@ -756,8 +756,8 @@ netbeans_end(void)
756756
static void
757757
nb_send(char *buf, char *fun)
758758
{
759-
if (nb_channel_idx >= 0)
760-
channel_send(nb_channel_idx, (char_u *)buf, fun);
759+
if (nb_channel != NULL)
760+
channel_send(nb_channel, (char_u *)buf, fun);
761761
}
762762

763763
/*

src/os_unix.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5043,7 +5043,7 @@ mch_start_job(char **argv, job_T *job)
50435043
int fd_in[2]; /* for stdin */
50445044
int fd_out[2]; /* for stdout */
50455045
int fd_err[2]; /* for stderr */
5046-
int ch_idx;
5046+
channel_T *channel;
50475047

50485048
/* default is to fail */
50495049
job->jv_status = JOB_FAILED;
@@ -5055,8 +5055,8 @@ mch_start_job(char **argv, job_T *job)
50555055
if ((pipe(fd_in) < 0) || (pipe(fd_out) < 0) ||(pipe(fd_err) < 0))
50565056
goto failed;
50575057

5058-
ch_idx = add_channel();
5059-
if (ch_idx < 0)
5058+
channel = add_channel();
5059+
if (channel == NULL)
50605060
goto failed;
50615061

50625062
pid = fork(); /* maybe we should use vfork() */
@@ -5108,14 +5108,14 @@ mch_start_job(char **argv, job_T *job)
51085108
/* parent */
51095109
job->jv_pid = pid;
51105110
job->jv_status = JOB_STARTED;
5111-
job->jv_channel = ch_idx;
5111+
job->jv_channel = channel;
51125112

51135113
/* child stdin, stdout and stderr */
51145114
close(fd_in[0]);
51155115
close(fd_out[1]);
51165116
close(fd_err[1]);
5117-
channel_set_pipes(ch_idx, fd_in[1], fd_out[0], fd_err[0]);
5118-
channel_set_job(ch_idx, job);
5117+
channel_set_pipes(channel, fd_in[1], fd_out[0], fd_err[0]);
5118+
channel_set_job(channel, job);
51195119

51205120
return;
51215121

src/proto/channel.pro

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
11
/* channel.c */
22
void ch_logfile(FILE *file);
3-
int add_channel(void);
3+
channel_T *add_channel(void);
4+
void channel_free(channel_T *channel);
45
void channel_gui_register_all(void);
5-
int channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void));
6-
void channel_set_pipes(int idx, int in, int out, int err);
7-
void channel_set_job(int idx, job_T *job);
8-
void channel_set_json_mode(int idx, ch_mode_T ch_mode);
9-
void channel_set_timeout(int idx, int timeout);
10-
void channel_set_callback(int idx, char_u *callback);
11-
void channel_set_req_callback(int idx, char_u *callback, int id);
12-
char_u *channel_get(int idx);
13-
int channel_collapse(int idx);
14-
int channel_can_write_to(int idx);
15-
int channel_is_open(int idx);
16-
void channel_close(int idx);
17-
int channel_save(int idx, char_u *buf, int len);
18-
char_u *channel_peek(int idx);
19-
void channel_clear(int idx);
6+
channel_T *channel_open(char *hostname, int port_in, int waittime, void (*close_cb)(void));
7+
void channel_set_pipes(channel_T *channel, int in, int out, int err);
8+
void channel_set_job(channel_T *channel, job_T *job);
9+
void channel_set_json_mode(channel_T *channel, ch_mode_T ch_mode);
10+
void channel_set_timeout(channel_T *channel, int timeout);
11+
void channel_set_callback(channel_T *channel, char_u *callback);
12+
void channel_set_req_callback(channel_T *channel, char_u *callback, int id);
13+
char_u *channel_get(channel_T *channel);
14+
int channel_collapse(channel_T *channel);
15+
int channel_can_write_to(channel_T *channel);
16+
int channel_is_open(channel_T *channel);
17+
char *channel_status(channel_T *channel);
18+
void channel_close(channel_T *channel);
19+
int channel_save(channel_T *channel, char_u *buf, int len);
20+
char_u *channel_peek(channel_T *channel);
21+
void channel_clear(channel_T *channel);
22+
void channel_free_all(void);
2023
int channel_get_id(void);
21-
void channel_read(int idx, int use_stderr, char *func);
22-
char_u *channel_read_block(int idx);
23-
int channel_read_json_block(int ch_idx, int id, typval_T **rettv);
24-
int channel_fd2idx(sock_T fd);
25-
int channel_send(int idx, char_u *buf, char *fun);
24+
void channel_read(channel_T *channel, int use_stderr, char *func);
25+
char_u *channel_read_block(channel_T *channel);
26+
int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
27+
channel_T *channel_fd2channel(sock_T fd);
28+
int channel_send(channel_T *channel, char_u *buf, char *fun);
2629
int channel_poll_setup(int nfd_in, void *fds_in);
2730
int channel_poll_check(int ret_in, void *fds_in);
2831
int channel_select_setup(int maxfd_in, void *rfds_in);
2932
int channel_select_check(int ret_in, void *rfds_in);
3033
int channel_parse_messages(void);
3134
int set_ref_in_channel(int copyID);
32-
ch_mode_T channel_get_mode(int idx);
35+
ch_mode_T channel_get_mode(channel_T *channel);
3336
/* vim: set ft=c : */

0 commit comments

Comments
 (0)