[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 05/14] Add a short Sleep between CreateFile calls
On Thu, Jan 25, 2018 at 11:37 AM, Paul Durrant <Paul.Durrant@xxxxxxxxxx> wrote: <snip>
First, to Owen: It would be very helpful
to have some context on these patches. I had to really root around to
discover that these patches were for a repo called "xencons". Second, to Paul: You
are correct - this Sleep(50) really should be replaced by
WaitNamedPipe(50), and it should probably be done for *both* CreateFile
calls, not just the one. Background: I
believe it would be most helpful to start with the key differences
between accepting a socket connection and accepting a Win32 named pipe
connection. To
start accepting socket connections, you call listen() with a parameter
(I usually use 5 or so). This parameter, called "backlog", represents
the maximum number of pending connection requests against that socket.
If connections come in and there isn't an active accept() call running
against the socket, it will go into the backlog, and the next accept()
call will pull that connection off the backlog and create a new socket
to operate on. If the backlog is full, the OS will immediately reject
the connection request with a "connection refused" error code. To
accept a named pipe connection, you create a named pipe with
CreateNamedPipe (which does exactly what the name implies) then call
ConnectNamedPipe (which actually means "wait for a client to connect to
the named pipe"). In socket terms, CreateNamedPipe is a combination
of socket() and listen(), while ConnectNamedPipe is like accept(). The
key difference is this: accept() creates a socket and leaves the
listening socket ready for new connections, while ConnectNamedPipe
actually converts the passed pipe from a listening pipe to a connected
pipe. Because of this, a named pipe instance is limited to a backlog of
1. In order to accept multiple clients simultaneously, a server needs
to create multiple instances of each pipe.Just like in sockets, attempting to connect when the backlog is full will result in 'named pipe busy' error. To
help deal with this problem, the WaitNamedPipe function waits, with a
timeout, until an unconnected pipe instance is available (either a
connected pipe is disconnected and put back into a listening state, or a
new pipe instance is created.). Note that
this function does not *claim* an instance, it only waits until one
exists. So it's possible to have WaitNamedPipe to return success, then
another thread jumps in and grabs it before you can, and CreateFile
fails anyway. This caveat is specifically called out in the
WaitNamedPipe documentation.
-- -- Stevie-O
Real programmers use COPY CON PROGRAM.EXE _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |