mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	win: open child stdio handles in overlapped-mode (#8113)
This will be used e.g. by the python client for native asyncio support
This commit is contained in:
		 Björn Linse
					Björn Linse
				
			
				
					committed by
					
						 Justin M. Keyes
						Justin M. Keyes
					
				
			
			
				
	
			
			
			 Justin M. Keyes
						Justin M. Keyes
					
				
			
						parent
						
							a369385009
						
					
				
				
					commit
					009ccfe170
				
			| @@ -51,12 +51,19 @@ int libuv_process_spawn(LibuvProcess *uvproc) | |||||||
|  |  | ||||||
|   if (!proc->in.closed) { |   if (!proc->in.closed) { | ||||||
|     uvproc->uvstdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; |     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, |     uvproc->uvstdio[0].data.stream = STRUCT_CAST(uv_stream_t, | ||||||
|                                                  &proc->in.uv.pipe); |                                                  &proc->in.uv.pipe); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (!proc->out.closed) { |   if (!proc->out.closed) { | ||||||
|     uvproc->uvstdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; |     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, |     uvproc->uvstdio[1].data.stream = STRUCT_CAST(uv_stream_t, | ||||||
|                                                  &proc->out.uv.pipe); |                                                  &proc->out.uv.pipe); | ||||||
|   } |   } | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								third-party/cmake/BuildLibuv.cmake
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								third-party/cmake/BuildLibuv.cmake
									
									
									
									
										vendored
									
									
								
							| @@ -7,7 +7,7 @@ function(BuildLibuv) | |||||||
|   cmake_parse_arguments(_libuv |   cmake_parse_arguments(_libuv | ||||||
|     "BUILD_IN_SOURCE" |     "BUILD_IN_SOURCE" | ||||||
|     "TARGET" |     "TARGET" | ||||||
|     "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND" |     "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND" | ||||||
|     ${ARGN}) |     ${ARGN}) | ||||||
|  |  | ||||||
|   if(NOT _libuv_CONFIGURE_COMMAND AND NOT _libuv_BUILD_COMMAND |   if(NOT _libuv_CONFIGURE_COMMAND AND NOT _libuv_BUILD_COMMAND | ||||||
| @@ -31,6 +31,7 @@ function(BuildLibuv) | |||||||
|       -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR} |       -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR} | ||||||
|       -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake |       -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake | ||||||
|     BUILD_IN_SOURCE ${_libuv_BUILD_IN_SOURCE} |     BUILD_IN_SOURCE ${_libuv_BUILD_IN_SOURCE} | ||||||
|  |     PATCH_COMMAND "${_libuv_PATCH_COMMAND}" | ||||||
|     CONFIGURE_COMMAND "${_libuv_CONFIGURE_COMMAND}" |     CONFIGURE_COMMAND "${_libuv_CONFIGURE_COMMAND}" | ||||||
|     BUILD_COMMAND "${_libuv_BUILD_COMMAND}" |     BUILD_COMMAND "${_libuv_BUILD_COMMAND}" | ||||||
|     INSTALL_COMMAND "${_libuv_INSTALL_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 |   --prefix=${DEPS_INSTALL_DIR} --libdir=${DEPS_INSTALL_DIR}/lib | ||||||
|   CC=${DEPS_C_COMPILER}) |   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) | if(UNIX) | ||||||
|   BuildLibuv( |   BuildLibuv( | ||||||
|     CONFIGURE_COMMAND ${UNIX_CFGCMD} MAKE=${MAKE_PRG} |     CONFIGURE_COMMAND ${UNIX_CFGCMD} MAKE=${MAKE_PRG} | ||||||
| @@ -54,6 +60,7 @@ elseif(MINGW AND CMAKE_CROSSCOMPILING) | |||||||
|  |  | ||||||
|   # Build libuv for the target |   # Build libuv for the target | ||||||
|   BuildLibuv( |   BuildLibuv( | ||||||
|  |     PATCH_COMMAND ${LIBUV_PATCH_COMMAND} | ||||||
|     CONFIGURE_COMMAND ${UNIX_CFGCMD} --host=${CROSS_TARGET} |     CONFIGURE_COMMAND ${UNIX_CFGCMD} --host=${CROSS_TARGET} | ||||||
|     INSTALL_COMMAND ${MAKE_PRG} V=1 install) |     INSTALL_COMMAND ${MAKE_PRG} V=1 install) | ||||||
|  |  | ||||||
| @@ -61,6 +68,7 @@ elseif(MINGW) | |||||||
|  |  | ||||||
|   # Native MinGW |   # Native MinGW | ||||||
|   BuildLibUv(BUILD_IN_SOURCE |   BuildLibUv(BUILD_IN_SOURCE | ||||||
|  |     PATCH_COMMAND ${LIBUV_PATCH_COMMAND} | ||||||
|     BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -f Makefile.mingw |     BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -f Makefile.mingw | ||||||
|     INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib |     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 |       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}) |   set(UV_OUTPUT_DIR ${DEPS_BUILD_DIR}/src/libuv/${CMAKE_BUILD_TYPE}) | ||||||
|   BuildLibUv(BUILD_IN_SOURCE |   BuildLibUv(BUILD_IN_SOURCE | ||||||
|  |     PATCH_COMMAND ${LIBUV_PATCH_COMMAND} | ||||||
|     CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy |     CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy | ||||||
|         ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibuvCMakeLists.txt |         ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibuvCMakeLists.txt | ||||||
|         ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt |         ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt | ||||||
|   | |||||||
							
								
								
									
										33
									
								
								third-party/patches/libuv-overlapped.patch
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								third-party/patches/libuv-overlapped.patch
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -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(); | ||||||
		Reference in New Issue
	
	Block a user