Mercurial > vim
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 */ |