diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2018-04-25 10:11:08 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2018-04-25 10:11:08 +0200 |
commit | 009ccfe170ada2c78ca7feabda567a7e901fb30b (patch) | |
tree | 58dd035ff52f2020c06ca3add16b12d0c572fe48 | |
parent | a36938500988e3ba447332df99ed0057fea1ac00 (diff) | |
download | rneovim-009ccfe170ada2c78ca7feabda567a7e901fb30b.tar.gz rneovim-009ccfe170ada2c78ca7feabda567a7e901fb30b.tar.bz2 rneovim-009ccfe170ada2c78ca7feabda567a7e901fb30b.zip |
win: open child stdio handles in overlapped-mode (#8113)
This will be used e.g. by the python client for native asyncio support
-rw-r--r-- | src/nvim/event/libuv_process.c | 7 | ||||
-rw-r--r-- | third-party/cmake/BuildLibuv.cmake | 11 | ||||
-rw-r--r-- | third-party/patches/libuv-overlapped.patch | 33 |
3 files changed, 50 insertions, 1 deletions
diff --git a/src/nvim/event/libuv_process.c b/src/nvim/event/libuv_process.c index 0c2bf397e5..ffe2db9b76 100644 --- a/src/nvim/event/libuv_process.c +++ b/src/nvim/event/libuv_process.c @@ -51,12 +51,19 @@ int libuv_process_spawn(LibuvProcess *uvproc) if (!proc->in.closed) { uvproc->uvstdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; +#ifdef WIN32 + uvproc->uvstdio[0].flags |= UV_OVERLAPPED_PIPE; +#endif uvproc->uvstdio[0].data.stream = STRUCT_CAST(uv_stream_t, &proc->in.uv.pipe); } if (!proc->out.closed) { uvproc->uvstdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; +#ifdef WIN32 + // pipe must be readable for IOCP to work. + uvproc->uvstdio[1].flags |= UV_READABLE_PIPE | UV_OVERLAPPED_PIPE; +#endif uvproc->uvstdio[1].data.stream = STRUCT_CAST(uv_stream_t, &proc->out.uv.pipe); } diff --git a/third-party/cmake/BuildLibuv.cmake b/third-party/cmake/BuildLibuv.cmake index 8ac7624be6..084e707f92 100644 --- a/third-party/cmake/BuildLibuv.cmake +++ b/third-party/cmake/BuildLibuv.cmake @@ -7,7 +7,7 @@ function(BuildLibuv) cmake_parse_arguments(_libuv "BUILD_IN_SOURCE" "TARGET" - "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND" + "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND" ${ARGN}) if(NOT _libuv_CONFIGURE_COMMAND AND NOT _libuv_BUILD_COMMAND @@ -31,6 +31,7 @@ function(BuildLibuv) -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake BUILD_IN_SOURCE ${_libuv_BUILD_IN_SOURCE} + PATCH_COMMAND "${_libuv_PATCH_COMMAND}" CONFIGURE_COMMAND "${_libuv_CONFIGURE_COMMAND}" BUILD_COMMAND "${_libuv_BUILD_COMMAND}" INSTALL_COMMAND "${_libuv_INSTALL_COMMAND}") @@ -41,6 +42,11 @@ set(UNIX_CFGCMD sh ${DEPS_BUILD_DIR}/src/libuv/autogen.sh && --prefix=${DEPS_INSTALL_DIR} --libdir=${DEPS_INSTALL_DIR}/lib CC=${DEPS_C_COMPILER}) +set(LIBUV_PATCH_COMMAND +${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libuv init + COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libuv apply + ${CMAKE_CURRENT_SOURCE_DIR}/patches/libuv-overlapped.patch) + if(UNIX) BuildLibuv( CONFIGURE_COMMAND ${UNIX_CFGCMD} MAKE=${MAKE_PRG} @@ -54,6 +60,7 @@ elseif(MINGW AND CMAKE_CROSSCOMPILING) # Build libuv for the target BuildLibuv( + PATCH_COMMAND ${LIBUV_PATCH_COMMAND} CONFIGURE_COMMAND ${UNIX_CFGCMD} --host=${CROSS_TARGET} INSTALL_COMMAND ${MAKE_PRG} V=1 install) @@ -61,6 +68,7 @@ elseif(MINGW) # Native MinGW BuildLibUv(BUILD_IN_SOURCE + PATCH_COMMAND ${LIBUV_PATCH_COMMAND} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -f Makefile.mingw INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/libuv/libuv.a ${DEPS_INSTALL_DIR}/lib @@ -72,6 +80,7 @@ elseif(WIN32 AND MSVC) set(UV_OUTPUT_DIR ${DEPS_BUILD_DIR}/src/libuv/${CMAKE_BUILD_TYPE}) BuildLibUv(BUILD_IN_SOURCE + PATCH_COMMAND ${LIBUV_PATCH_COMMAND} CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibuvCMakeLists.txt ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt diff --git a/third-party/patches/libuv-overlapped.patch b/third-party/patches/libuv-overlapped.patch new file mode 100644 index 0000000000..f4ea19a146 --- /dev/null +++ b/third-party/patches/libuv-overlapped.patch @@ -0,0 +1,33 @@ +diff --git a/include/uv.h b/include/uv.h +index cdd251d8..79b7930e 100644 +--- a/include/uv.h ++++ b/include/uv.h +@@ -865,7 +865,8 @@ typedef enum { + * flags may be specified to create a duplex data stream. + */ + UV_READABLE_PIPE = 0x10, +- UV_WRITABLE_PIPE = 0x20 ++ UV_WRITABLE_PIPE = 0x20, ++ UV_OVERLAPPED_PIPE = 0x40 + } uv_stdio_flags; + + typedef struct uv_stdio_container_s { +diff --git a/src/win/process-stdio.c b/src/win/process-stdio.c +index 032e3093..b53bdea7 100644 +--- a/src/win/process-stdio.c ++++ b/src/win/process-stdio.c +@@ -131,12 +131,13 @@ static int uv__create_stdio_pipe_pair(uv_loop_t* loop, + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + ++ BOOL overlap = server_pipe->ipc || (flags & UV_OVERLAPPED_PIPE); + child_pipe = CreateFileA(pipe_name, + client_access, + 0, + &sa, + OPEN_EXISTING, +- server_pipe->ipc ? FILE_FLAG_OVERLAPPED : 0, ++ overlap ? FILE_FLAG_OVERLAPPED : 0, + NULL); + if (child_pipe == INVALID_HANDLE_VALUE) { + err = GetLastError(); |