Cygwin: FIFO: code simplification
There are currently three functions that call NtQueryInformationFile to determine the state of a pipe instance. Do this only once, in a new fifo_client_handler::set_state () function, and call that when state information is needed. Remove the fifo_client_handler methods pipe_state and get_state, which are no longer needed. Make fhandler_fifo::get_fc_handler return a reference, for use in select.cc:peek_fifo. Make other small changes to ensure that this commit doesn't change any decisions based on the state of a fifo_client_handler. The tricky part is interpreting FILE_PIPE_CLOSING_STATE, which we translate to fc_closing. Our current interpretation, which is not changing as a result of this commit, is that the writer at the other end of the pipe instance is viewed as still connected from the point of view of raw_read and determining EOF. But it is not viewed as still connected if we are deciding whether to unblock a new reader that is trying to open.
This commit is contained in:
@ -1269,34 +1269,31 @@ public:
|
||||
|
||||
#define CYGWIN_FIFO_PIPE_NAME_LEN 47
|
||||
|
||||
/* The last three are the ones we try to read from. */
|
||||
/* We view the fc_closing state as borderline between open and closed
|
||||
for a writer at the other end of a fifo_client_handler.
|
||||
|
||||
We still attempt to read from the writer when the handler is in
|
||||
this state, and we don't declare a reader to be at EOF if there's a
|
||||
handler in this state. But the existence of a handler in this
|
||||
state is not sufficient to unblock a reader trying to open. */
|
||||
enum fifo_client_connect_state
|
||||
{
|
||||
fc_unknown,
|
||||
fc_error,
|
||||
fc_disconnected,
|
||||
fc_listening,
|
||||
fc_connected,
|
||||
fc_closing,
|
||||
fc_connected,
|
||||
fc_input_avail,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
FILE_PIPE_INPUT_AVAILABLE_STATE = 5
|
||||
};
|
||||
|
||||
struct fifo_client_handler
|
||||
{
|
||||
HANDLE h;
|
||||
fifo_client_connect_state state;
|
||||
fifo_client_handler () : h (NULL), state (fc_unknown) {}
|
||||
void close () { NtClose (h); }
|
||||
/* Returns FILE_PIPE_DISCONNECTED_STATE, FILE_PIPE_LISTENING_STATE,
|
||||
FILE_PIPE_CONNECTED_STATE, FILE_PIPE_CLOSING_STATE,
|
||||
FILE_PIPE_INPUT_AVAILABLE_STATE, or -1 on error. */
|
||||
fifo_client_connect_state &get_state () { return state; }
|
||||
int pipe_state ();
|
||||
fifo_client_connect_state set_state ();
|
||||
};
|
||||
|
||||
class fhandler_fifo;
|
||||
@ -1462,7 +1459,7 @@ public:
|
||||
bool maybe_eof () const { return _maybe_eof; }
|
||||
void maybe_eof (bool val) { _maybe_eof = val; }
|
||||
int get_nhandlers () const { return nhandlers; }
|
||||
fifo_client_handler get_fc_handler (int i) const { return fc_handler[i]; }
|
||||
fifo_client_handler &get_fc_handler (int i) { return fc_handler[i]; }
|
||||
PUNICODE_STRING get_pipe_name ();
|
||||
DWORD fifo_reader_thread_func ();
|
||||
void fifo_client_lock () { _fifo_client_lock.lock (); }
|
||||
|
Reference in New Issue
Block a user