comparison src/channel.c @ 8493:caed4b2d305f v7.4.1537

commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Mar 11 22:52:15 2016 +0100 patch 7.4.1537 Problem: Too many feature flags for pipes, jobs and channels. Solution: Only use FEAT_JOB_CHANNEL.
author Christian Brabandt <cb@256bit.org>
date Fri, 11 Mar 2016 23:00:06 +0100
parents daebcbd87bd3
children 42277980a76d
comparison
equal deleted inserted replaced
8492:a2a51c928924 8493:caed4b2d305f
10 * Implements communication through a socket or any file handle. 10 * Implements communication through a socket or any file handle.
11 */ 11 */
12 12
13 #include "vim.h" 13 #include "vim.h"
14 14
15 #if defined(FEAT_CHANNEL) || defined(PROTO) 15 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
16 16
17 /* TRUE when netbeans is running with a GUI. */ 17 /* TRUE when netbeans is running with a GUI. */
18 #ifdef FEAT_GUI 18 #ifdef FEAT_GUI
19 # define CH_HAS_GUI (gui.in_use || gui.starting) 19 # define CH_HAS_GUI (gui.in_use || gui.starting)
20 #endif 20 #endif
292 return NULL; 292 return NULL;
293 293
294 channel->ch_id = next_ch_id++; 294 channel->ch_id = next_ch_id++;
295 ch_log(channel, "Created channel"); 295 ch_log(channel, "Created channel");
296 296
297 #ifdef CHANNEL_PIPES
298 for (part = PART_SOCK; part <= PART_IN; ++part) 297 for (part = PART_SOCK; part <= PART_IN; ++part)
299 #else
300 part = PART_SOCK;
301 #endif
302 { 298 {
303 channel->ch_part[part].ch_fd = INVALID_FD; 299 channel->ch_part[part].ch_fd = INVALID_FD;
304 #ifdef FEAT_GUI_X11 300 #ifdef FEAT_GUI_X11
305 channel->ch_part[part].ch_inputHandler = (XtInputId)NULL; 301 channel->ch_part[part].ch_inputHandler = (XtInputId)NULL;
306 #endif 302 #endif
328 */ 324 */
329 static int 325 static int
330 channel_still_useful(channel_T *channel) 326 channel_still_useful(channel_T *channel)
331 { 327 {
332 int has_sock_msg; 328 int has_sock_msg;
333 #ifdef CHANNEL_PIPES
334 int has_out_msg; 329 int has_out_msg;
335 int has_err_msg; 330 int has_err_msg;
336 #endif
337 331
338 /* If the job was killed the channel is not expected to work anymore. */ 332 /* If the job was killed the channel is not expected to work anymore. */
339 if (channel->ch_job_killed && channel->ch_job == NULL) 333 if (channel->ch_job_killed && channel->ch_job == NULL)
340 return FALSE; 334 return FALSE;
341 335
346 /* If there is no callback then nobody can get readahead. If the fd is 340 /* If there is no callback then nobody can get readahead. If the fd is
347 * closed and there is no readahead then the callback won't be called. */ 341 * closed and there is no readahead then the callback won't be called. */
348 has_sock_msg = channel->ch_part[PART_SOCK].ch_fd != INVALID_FD 342 has_sock_msg = channel->ch_part[PART_SOCK].ch_fd != INVALID_FD
349 || channel->ch_part[PART_SOCK].ch_head.rq_next != NULL 343 || channel->ch_part[PART_SOCK].ch_head.rq_next != NULL
350 || channel->ch_part[PART_SOCK].ch_json_head.jq_next != NULL; 344 || channel->ch_part[PART_SOCK].ch_json_head.jq_next != NULL;
351 #ifdef CHANNEL_PIPES
352 has_out_msg = channel->ch_part[PART_OUT].ch_fd != INVALID_FD 345 has_out_msg = channel->ch_part[PART_OUT].ch_fd != INVALID_FD
353 || channel->ch_part[PART_OUT].ch_head.rq_next != NULL 346 || channel->ch_part[PART_OUT].ch_head.rq_next != NULL
354 || channel->ch_part[PART_OUT].ch_json_head.jq_next != NULL; 347 || channel->ch_part[PART_OUT].ch_json_head.jq_next != NULL;
355 has_err_msg = channel->ch_part[PART_ERR].ch_fd != INVALID_FD 348 has_err_msg = channel->ch_part[PART_ERR].ch_fd != INVALID_FD
356 || channel->ch_part[PART_ERR].ch_head.rq_next != NULL 349 || channel->ch_part[PART_ERR].ch_head.rq_next != NULL
357 || channel->ch_part[PART_ERR].ch_json_head.jq_next != NULL; 350 || channel->ch_part[PART_ERR].ch_json_head.jq_next != NULL;
358 #endif
359 return (channel->ch_callback != NULL && (has_sock_msg 351 return (channel->ch_callback != NULL && (has_sock_msg
360 #ifdef CHANNEL_PIPES 352 || has_out_msg || has_err_msg))
361 || has_out_msg || has_err_msg
362 #endif
363 ))
364 #ifdef CHANNEL_PIPES
365 || (channel->ch_part[PART_OUT].ch_callback != NULL && has_out_msg) 353 || (channel->ch_part[PART_OUT].ch_callback != NULL && has_out_msg)
366 || (channel->ch_part[PART_ERR].ch_callback != NULL && has_err_msg) 354 || (channel->ch_part[PART_ERR].ch_callback != NULL && has_err_msg);
367 #endif
368 ;
369 } 355 }
370 356
371 /* 357 /*
372 * Close a channel and free all its resources if there is no further action 358 * Close a channel and free all its resources if there is no further action
373 * possible, there is no callback to be invoked or the associated job was 359 * possible, there is no callback to be invoked or the associated job was
505 static void 491 static void
506 channel_gui_register(channel_T *channel) 492 channel_gui_register(channel_T *channel)
507 { 493 {
508 if (channel->CH_SOCK_FD != INVALID_FD) 494 if (channel->CH_SOCK_FD != INVALID_FD)
509 channel_gui_register_one(channel, PART_SOCK); 495 channel_gui_register_one(channel, PART_SOCK);
510 # ifdef CHANNEL_PIPES
511 if (channel->CH_OUT_FD != INVALID_FD) 496 if (channel->CH_OUT_FD != INVALID_FD)
512 channel_gui_register_one(channel, PART_OUT); 497 channel_gui_register_one(channel, PART_OUT);
513 if (channel->CH_ERR_FD != INVALID_FD) 498 if (channel->CH_ERR_FD != INVALID_FD)
514 channel_gui_register_one(channel, PART_ERR); 499 channel_gui_register_one(channel, PART_ERR);
515 # endif
516 } 500 }
517 501
518 /* 502 /*
519 * Register any of our file descriptors with the GUI event handling system. 503 * Register any of our file descriptors with the GUI event handling system.
520 * Called when the GUI has started. 504 * Called when the GUI has started.
555 static void 539 static void
556 channel_gui_unregister(channel_T *channel) 540 channel_gui_unregister(channel_T *channel)
557 { 541 {
558 int part; 542 int part;
559 543
560 #ifdef CHANNEL_PIPES
561 for (part = PART_SOCK; part < PART_IN; ++part) 544 for (part = PART_SOCK; part < PART_IN; ++part)
562 #else
563 part = PART_SOCK;
564 #endif
565 {
566 channel_gui_unregister_one(channel, part); 545 channel_gui_unregister_one(channel, part);
567 }
568 } 546 }
569 547
570 #endif 548 #endif
571 549
572 static char *e_cannot_connect = N_("E902: Cannot connect to port"); 550 static char *e_cannot_connect = N_("E902: Cannot connect to port");
840 #endif 818 #endif
841 819
842 return channel; 820 return channel;
843 } 821 }
844 822
845 #if defined(CHANNEL_PIPES) || defined(PROTO)
846 static void 823 static void
847 may_close_part(sock_T *fd) 824 may_close_part(sock_T *fd)
848 { 825 {
849 if (*fd != INVALID_FD) 826 if (*fd != INVALID_FD)
850 { 827 {
882 # if defined(FEAT_GUI) 859 # if defined(FEAT_GUI)
883 channel_gui_register_one(channel, PART_ERR); 860 channel_gui_register_one(channel, PART_ERR);
884 # endif 861 # endif
885 } 862 }
886 } 863 }
887 #endif
888 864
889 /* 865 /*
890 * Sets the job the channel is associated with and associated options. 866 * Sets the job the channel is associated with and associated options.
891 * This does not keep a refcount, when the job is freed ch_job is cleared. 867 * This does not keep a refcount, when the job is freed ch_job is cleared.
892 */ 868 */
1895 */ 1871 */
1896 int 1872 int
1897 channel_can_write_to(channel_T *channel) 1873 channel_can_write_to(channel_T *channel)
1898 { 1874 {
1899 return channel != NULL && (channel->CH_SOCK_FD != INVALID_FD 1875 return channel != NULL && (channel->CH_SOCK_FD != INVALID_FD
1900 #ifdef CHANNEL_PIPES 1876 || channel->CH_IN_FD != INVALID_FD);
1901 || channel->CH_IN_FD != INVALID_FD
1902 #endif
1903 );
1904 } 1877 }
1905 1878
1906 /* 1879 /*
1907 * Return TRUE when channel "channel" is open for reading or writing. 1880 * Return TRUE when channel "channel" is open for reading or writing.
1908 * Also returns FALSE for invalid "channel". 1881 * Also returns FALSE for invalid "channel".
1909 */ 1882 */
1910 int 1883 int
1911 channel_is_open(channel_T *channel) 1884 channel_is_open(channel_T *channel)
1912 { 1885 {
1913 return channel != NULL && (channel->CH_SOCK_FD != INVALID_FD 1886 return channel != NULL && (channel->CH_SOCK_FD != INVALID_FD
1914 #ifdef CHANNEL_PIPES
1915 || channel->CH_IN_FD != INVALID_FD 1887 || channel->CH_IN_FD != INVALID_FD
1916 || channel->CH_OUT_FD != INVALID_FD 1888 || channel->CH_OUT_FD != INVALID_FD
1917 || channel->CH_ERR_FD != INVALID_FD 1889 || channel->CH_ERR_FD != INVALID_FD);
1918 #endif
1919 );
1920 } 1890 }
1921 1891
1922 /* 1892 /*
1923 * Return a string indicating the status of the channel. 1893 * Return a string indicating the status of the channel.
1924 */ 1894 */
1949 if (channel->CH_SOCK_FD != INVALID_FD) 1919 if (channel->CH_SOCK_FD != INVALID_FD)
1950 { 1920 {
1951 sock_close(channel->CH_SOCK_FD); 1921 sock_close(channel->CH_SOCK_FD);
1952 channel->CH_SOCK_FD = INVALID_FD; 1922 channel->CH_SOCK_FD = INVALID_FD;
1953 } 1923 }
1954 #if defined(CHANNEL_PIPES)
1955 may_close_part(&channel->CH_IN_FD); 1924 may_close_part(&channel->CH_IN_FD);
1956 may_close_part(&channel->CH_OUT_FD); 1925 may_close_part(&channel->CH_OUT_FD);
1957 may_close_part(&channel->CH_ERR_FD); 1926 may_close_part(&channel->CH_ERR_FD);
1958 #endif
1959 1927
1960 if (invoke_close_cb && channel->ch_close_cb != NULL) 1928 if (invoke_close_cb && channel->ch_close_cb != NULL)
1961 { 1929 {
1962 typval_T argv[1]; 1930 typval_T argv[1];
1963 typval_T rettv; 1931 typval_T rettv;
2034 void 2002 void
2035 channel_clear(channel_T *channel) 2003 channel_clear(channel_T *channel)
2036 { 2004 {
2037 ch_log(channel, "Clearing channel"); 2005 ch_log(channel, "Clearing channel");
2038 channel_clear_one(channel, PART_SOCK); 2006 channel_clear_one(channel, PART_SOCK);
2039 #ifdef CHANNEL_PIPES
2040 channel_clear_one(channel, PART_OUT); 2007 channel_clear_one(channel, PART_OUT);
2041 channel_clear_one(channel, PART_ERR); 2008 channel_clear_one(channel, PART_ERR);
2042 #endif
2043 vim_free(channel->ch_callback); 2009 vim_free(channel->ch_callback);
2044 channel->ch_callback = NULL; 2010 channel->ch_callback = NULL;
2045 vim_free(channel->ch_close_cb); 2011 vim_free(channel->ch_close_cb);
2046 channel->ch_close_cb = NULL; 2012 channel->ch_close_cb = NULL;
2047 } 2013 }
2355 2321
2356 if (fd != INVALID_FD) 2322 if (fd != INVALID_FD)
2357 for (channel = first_channel; channel != NULL; 2323 for (channel = first_channel; channel != NULL;
2358 channel = channel->ch_next) 2324 channel = channel->ch_next)
2359 { 2325 {
2360 # ifdef CHANNEL_PIPES
2361 for (part = PART_SOCK; part < PART_IN; ++part) 2326 for (part = PART_SOCK; part < PART_IN; ++part)
2362 # else
2363 part = PART_SOCK;
2364 # endif
2365 if (channel->ch_part[part].ch_fd == fd) 2327 if (channel->ch_part[part].ch_fd == fd)
2366 { 2328 {
2367 *partp = part; 2329 *partp = part;
2368 return channel; 2330 return channel;
2369 } 2331 }
2384 int part; 2346 int part;
2385 sock_T fd; 2347 sock_T fd;
2386 2348
2387 for (channel = first_channel; channel != NULL; channel = channel->ch_next) 2349 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
2388 { 2350 {
2389 # ifdef CHANNEL_PIPES
2390 /* check the socket and pipes */ 2351 /* check the socket and pipes */
2391 for (part = PART_SOCK; part <= PART_ERR; ++part) 2352 for (part = PART_SOCK; part <= PART_ERR; ++part)
2392 # else
2393 /* only check the socket */
2394 part = PART_SOCK;
2395 # endif
2396 { 2353 {
2397 fd = channel->ch_part[part].ch_fd; 2354 fd = channel->ch_part[part].ch_fd;
2398 if (fd != INVALID_FD && channel_wait(channel, fd, 0) == OK) 2355 if (fd != INVALID_FD && channel_wait(channel, fd, 0) == OK)
2399 channel_read(channel, part, "channel_handle_events"); 2356 channel_read(channel, part, "channel_handle_events");
2400 } 2357 }
2469 struct pollfd *fds = fds_in; 2426 struct pollfd *fds = fds_in;
2470 int part; 2427 int part;
2471 2428
2472 for (channel = first_channel; channel != NULL; channel = channel->ch_next) 2429 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
2473 { 2430 {
2474 # ifdef CHANNEL_PIPES
2475 for (part = PART_SOCK; part < PART_IN; ++part) 2431 for (part = PART_SOCK; part < PART_IN; ++part)
2476 # else
2477 part = PART_SOCK;
2478 # endif
2479 { 2432 {
2480 if (channel->ch_part[part].ch_fd != INVALID_FD) 2433 if (channel->ch_part[part].ch_fd != INVALID_FD)
2481 { 2434 {
2482 channel->ch_part[part].ch_poll_idx = nfd; 2435 channel->ch_part[part].ch_poll_idx = nfd;
2483 fds[nfd].fd = channel->ch_part[part].ch_fd; 2436 fds[nfd].fd = channel->ch_part[part].ch_fd;
2503 struct pollfd *fds = fds_in; 2456 struct pollfd *fds = fds_in;
2504 int part; 2457 int part;
2505 2458
2506 for (channel = first_channel; channel != NULL; channel = channel->ch_next) 2459 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
2507 { 2460 {
2508 # ifdef CHANNEL_PIPES
2509 for (part = PART_SOCK; part < PART_IN; ++part) 2461 for (part = PART_SOCK; part < PART_IN; ++part)
2510 # else
2511 part = PART_SOCK;
2512 # endif
2513 { 2462 {
2514 int idx = channel->ch_part[part].ch_poll_idx; 2463 int idx = channel->ch_part[part].ch_poll_idx;
2515 2464
2516 if (ret > 0 && idx != -1 && fds[idx].revents & POLLIN) 2465 if (ret > 0 && idx != -1 && fds[idx].revents & POLLIN)
2517 { 2466 {
2537 fd_set *rfds = rfds_in; 2486 fd_set *rfds = rfds_in;
2538 int part; 2487 int part;
2539 2488
2540 for (channel = first_channel; channel != NULL; channel = channel->ch_next) 2489 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
2541 { 2490 {
2542 # ifdef CHANNEL_PIPES
2543 for (part = PART_SOCK; part < PART_IN; ++part) 2491 for (part = PART_SOCK; part < PART_IN; ++part)
2544 # else
2545 part = PART_SOCK;
2546 # endif
2547 { 2492 {
2548 sock_T fd = channel->ch_part[part].ch_fd; 2493 sock_T fd = channel->ch_part[part].ch_fd;
2549 2494
2550 if (fd != INVALID_FD) 2495 if (fd != INVALID_FD)
2551 { 2496 {
2570 fd_set *rfds = rfds_in; 2515 fd_set *rfds = rfds_in;
2571 int part; 2516 int part;
2572 2517
2573 for (channel = first_channel; channel != NULL; channel = channel->ch_next) 2518 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
2574 { 2519 {
2575 # ifdef CHANNEL_PIPES
2576 for (part = PART_SOCK; part < PART_IN; ++part) 2520 for (part = PART_SOCK; part < PART_IN; ++part)
2577 # else
2578 part = PART_SOCK;
2579 # endif
2580 { 2521 {
2581 sock_T fd = channel->ch_part[part].ch_fd; 2522 sock_T fd = channel->ch_part[part].ch_fd;
2582 2523
2583 if (ret > 0 && fd != INVALID_FD && FD_ISSET(fd, rfds)) 2524 if (ret > 0 && fd != INVALID_FD && FD_ISSET(fd, rfds))
2584 { 2525 {
2655 channel = first_channel; 2596 channel = first_channel;
2656 part = PART_SOCK; 2597 part = PART_SOCK;
2657 continue; 2598 continue;
2658 } 2599 }
2659 } 2600 }
2660 #ifdef CHANNEL_PIPES
2661 if (part < PART_ERR) 2601 if (part < PART_ERR)
2662 ++part; 2602 ++part;
2663 else 2603 else
2664 #endif
2665 { 2604 {
2666 channel = channel->ch_next; 2605 channel = channel->ch_next;
2667 part = PART_SOCK; 2606 part = PART_SOCK;
2668 } 2607 }
2669 } 2608 }
2690 channel_T *channel; 2629 channel_T *channel;
2691 int part; 2630 int part;
2692 2631
2693 for (channel = first_channel; channel != NULL; channel = channel->ch_next) 2632 for (channel = first_channel; channel != NULL; channel = channel->ch_next)
2694 { 2633 {
2695 #ifdef CHANNEL_PIPES
2696 for (part = PART_SOCK; part < PART_IN; ++part) 2634 for (part = PART_SOCK; part < PART_IN; ++part)
2697 #else
2698 part = PART_SOCK;
2699 #endif
2700 { 2635 {
2701 jsonq_T *head = &channel->ch_part[part].ch_json_head; 2636 jsonq_T *head = &channel->ch_part[part].ch_json_head;
2702 jsonq_T *item = head->jq_next; 2637 jsonq_T *item = head->jq_next;
2703 2638
2704 while (item != NULL) 2639 while (item != NULL)
2721 * Return the "part" to write to for "channel". 2656 * Return the "part" to write to for "channel".
2722 */ 2657 */
2723 int 2658 int
2724 channel_part_send(channel_T *channel) 2659 channel_part_send(channel_T *channel)
2725 { 2660 {
2726 #ifdef CHANNEL_PIPES
2727 if (channel->CH_SOCK_FD == INVALID_FD) 2661 if (channel->CH_SOCK_FD == INVALID_FD)
2728 return PART_IN; 2662 return PART_IN;
2729 #endif
2730 return PART_SOCK; 2663 return PART_SOCK;
2731 } 2664 }
2732 2665
2733 /* 2666 /*
2734 * Return the default "part" to read from for "channel". 2667 * Return the default "part" to read from for "channel".
2735 */ 2668 */
2736 int 2669 int
2737 channel_part_read(channel_T *channel) 2670 channel_part_read(channel_T *channel)
2738 { 2671 {
2739 #ifdef CHANNEL_PIPES
2740 if (channel->CH_SOCK_FD == INVALID_FD) 2672 if (channel->CH_SOCK_FD == INVALID_FD)
2741 return PART_OUT; 2673 return PART_OUT;
2742 #endif
2743 return PART_SOCK; 2674 return PART_SOCK;
2744 } 2675 }
2745 2676
2746 /* 2677 /*
2747 * Return the mode of "channel"/"part" 2678 * Return the mode of "channel"/"part"
2762 channel_get_timeout(channel_T *channel, int part) 2693 channel_get_timeout(channel_T *channel, int part)
2763 { 2694 {
2764 return channel->ch_part[part].ch_timeout; 2695 return channel->ch_part[part].ch_timeout;
2765 } 2696 }
2766 2697
2767 #endif /* FEAT_CHANNEL */ 2698 #endif /* FEAT_JOB_CHANNEL */