Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2012-02-01 09:27:42 +0400
committerChristopher Faylor <me@cgf.cx>2012-02-01 09:27:42 +0400
commitee766fda6847aa449557885ad82b0da86ac1c799 (patch)
treec0b76b0cd7dd09586b53dbf2b9e4475e69656923 /winsup/cygwin/select.cc
parentd3cb1dffefe964ae9bfd4a47a8075c2b3ecfd27f (diff)
* fhandler.cc (fhandler_base_overlapped::has_ongoing_io): Don't block
GetOverlappedResult since previous IsEventSignalled will have reset the handle. * select.cc (cygwin_select): Remove space before parentheses in syscall debugging output. (pipe_data_available): Streamline if block.
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r--winsup/cygwin/select.cc83
1 files changed, 36 insertions, 47 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index ff63b1e5e..316073e00 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -164,7 +164,7 @@ cygwin_select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
res = (res > 0) ? 0 : sel.poll (readfds, writefds, exceptfds);
}
- syscall_printf ("%R = select (%d, %p, %p, %p, %p)", res, maxfds, readfds,
+ syscall_printf ("%R = select(%d, %p, %p, %p, %p)", res, maxfds, readfds,
writefds, exceptfds, to);
return res;
}
@@ -490,54 +490,43 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE h, bool writing)
IO_STATUS_BLOCK iosb = {0};
FILE_PIPE_LOCAL_INFORMATION fpli = {0};
- bool res = false;
- if (!fh->has_ongoing_io ())
+ bool res;
+ if (fh->has_ongoing_io ())
+ res = false;
+ else if (NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
+ FilePipeLocalInformation))
{
- if (NtQueryInformationFile (h,
- &iosb,
- &fpli,
- sizeof (fpli),
- FilePipeLocalInformation))
- {
- /* If NtQueryInformationFile fails, optimistically assume the
- pipe is writable. This could happen if we somehow
- inherit a pipe that doesn't permit FILE_READ_ATTRIBUTES
- access on the write end. */
- select_printf ("fd %d, %s, NtQueryInformationFile failed",
- fd, fh->get_name ());
- res = writing ? true : -1;
- }
- else if (!writing)
- {
- res = !!fpli.ReadDataAvailable;
- paranoid_printf ("fd %d, %s, read avail %u", fd, fh->get_name (), fpli.ReadDataAvailable);
- }
- else
- {
- /* If there is anything available in the pipe buffer then signal
- that. This means that a pipe could still block since you could
- be trying to write more to the pipe than is available in the
- buffer but that is the hazard of select(). */
- if ((fpli.WriteQuotaAvailable = (fpli.OutboundQuota - fpli.ReadDataAvailable)))
- {
- paranoid_printf ("fd %d, %s, write: size %lu, avail %lu", fd,
- fh->get_name (), fpli.OutboundQuota,
- fpli.WriteQuotaAvailable);
- res = true;
- }
- /* If we somehow inherit a tiny pipe (size < PIPE_BUF), then consider
- the pipe writable only if it is completely empty, to minimize the
- probability that a subsequent write will block. */
- else if (fpli.OutboundQuota < PIPE_BUF &&
- fpli.WriteQuotaAvailable == fpli.OutboundQuota)
- {
- select_printf ("fd, %s, write tiny pipe: size %lu, avail %lu",
- fd, fh->get_name (), fpli.OutboundQuota,
- fpli.WriteQuotaAvailable);
- res = true;
- }
- }
+ /* If NtQueryInformationFile fails, optimistically assume the
+ pipe is writable. This could happen if we somehow
+ inherit a pipe that doesn't permit FILE_READ_ATTRIBUTES
+ access on the write end. */
+ select_printf ("fd %d, %s, NtQueryInformationFile failed",
+ fd, fh->get_name ());
+ res = writing ? true : -1;
+ }
+ else if (!writing)
+ {
+ paranoid_printf ("fd %d, %s, read avail %u", fd, fh->get_name (),
+ fpli.ReadDataAvailable);
+ res = !!fpli.ReadDataAvailable;
}
+ else if ((res = (fpli.WriteQuotaAvailable = (fpli.OutboundQuota -
+ fpli.ReadDataAvailable))))
+ /* If there is anything available in the pipe buffer then signal
+ that. This means that a pipe could still block since you could
+ be trying to write more to the pipe than is available in the
+ buffer but that is the hazard of select(). */
+ paranoid_printf ("fd %d, %s, write: size %lu, avail %lu", fd,
+ fh->get_name (), fpli.OutboundQuota,
+ fpli.WriteQuotaAvailable);
+ else if ((res = (fpli.OutboundQuota < PIPE_BUF &&
+ fpli.WriteQuotaAvailable == fpli.OutboundQuota)))
+ /* If we somehow inherit a tiny pipe (size < PIPE_BUF), then consider
+ the pipe writable only if it is completely empty, to minimize the
+ probability that a subsequent write will block. */
+ select_printf ("fd, %s, write tiny pipe: size %lu, avail %lu",
+ fd, fh->get_name (), fpli.OutboundQuota,
+ fpli.WriteQuotaAvailable);
return res ?: -!!(fpli.NamedPipeState & FILE_PIPE_CLOSING_STATE);
}