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) { | ||||
|     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); | ||||
|   } | ||||
|   | ||||
							
								
								
									
										11
									
								
								third-party/cmake/BuildLibuv.cmake
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								third-party/cmake/BuildLibuv.cmake
									
									
									
									
										vendored
									
									
								
							| @@ -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 | ||||
|   | ||||
							
								
								
									
										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