* fhandler.cc (fhandler_base::wait_overlapped): Always assume that bytes will

be non-NULL.  Distinguish input result from result derived from WFMO and
GetOverlappedResult or res can never be -1.  Only raise SIGPIPE when writing.
* fhandler.h (fhandler_base::wait_overlapped): Pass first argument by value.
* fhandler_fifo.cc (fhandler_fifo::wait): Pass in dummy byte count to
wait_overlapped.
* pipe.cc (DEFAULT_PIPEBUFSIZE): Define to 65536 explicitly.
This commit is contained in:
Christopher Faylor 2008-08-20 02:25:06 +00:00
parent ec8a7e416f
commit fbf39a58cb
5 changed files with 27 additions and 15 deletions

View File

@ -1,3 +1,15 @@
2008-08-19 Christopher Faylor <me+cygwin@cgf.cx>
* fhandler.cc (fhandler_base::wait_overlapped): Always assume that
bytes will be non-NULL. Distinguish input result from result derived
from WFMO and GetOverlappedResult or res can never be -1. Only raise
SIGPIPE when writing.
* fhandler.h (fhandler_base::wait_overlapped): Pass first argument by
value.
* fhandler_fifo.cc (fhandler_fifo::wait): Pass in dummy byte count to
wait_overlapped.
* pipe.cc (DEFAULT_PIPEBUFSIZE): Define to 65536 explicitly.
2008-08-19 Corinna Vinschen <corinna@vinschen.de> 2008-08-19 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc (fhandler_disk_file::mkdir): Drop fattr variable * fhandler_disk_file.cc (fhandler_disk_file::mkdir): Drop fattr variable

View File

@ -1680,17 +1680,16 @@ fhandler_base::destroy_overlapped ()
} }
int int
fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes) fhandler_base::wait_overlapped (bool inres, bool writing, DWORD *bytes)
{ {
if (bytes) int res;
*bytes = (DWORD) -1; *bytes = (DWORD) -1;
DWORD err = GetLastError (); DWORD err = GetLastError ();
if (!res && err != ERROR_IO_PENDING) if (!inres && err != ERROR_IO_PENDING)
{ {
if (err != ERROR_HANDLE_EOF) if (err != ERROR_HANDLE_EOF && err != ERROR_BROKEN_PIPE)
goto err; goto err;
res = 1; res = 1;
if (*bytes)
*bytes = 0; *bytes = 0;
} }
else else
@ -1707,12 +1706,13 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes)
if (&_my_tls == _main_tls) if (&_my_tls == _main_tls)
w4[n++] = signal_arrived; w4[n++] = signal_arrived;
HANDLE h = writing ? get_output_handle () : get_handle (); HANDLE h = writing ? get_output_handle () : get_handle ();
switch (WaitForMultipleObjects (n, w4, false, INFINITE)) DWORD res = WaitForMultipleObjects (n, w4, false, INFINITE);
ResetEvent (get_overlapped ()->hEvent);
switch (res)
{ {
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
debug_printf ("normal read"); debug_printf ("normal read");
if (!bytes || if (GetOverlappedResult (h, get_overlapped (), bytes, false))
GetOverlappedResult (h, get_overlapped (), bytes, false))
res = 1; res = 1;
else else
{ {
@ -1738,10 +1738,9 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes)
err: err:
__seterrno_from_win_error (err); __seterrno_from_win_error (err);
res = -1; res = -1;
if (err == ERROR_NO_DATA || err == ERROR_BROKEN_PIPE) if (writing && (err == ERROR_NO_DATA || err == ERROR_BROKEN_PIPE))
raise (SIGPIPE); raise (SIGPIPE);
out: out:
ResetEvent (get_overlapped ()->hEvent);
return res; return res;
} }

View File

@ -143,7 +143,7 @@ class fhandler_base
void del_my_locks (bool); void del_my_locks (bool);
HANDLE read_state; HANDLE read_state;
int wait_overlapped (bool&, bool, DWORD *) __attribute__ ((regparm (3))); int wait_overlapped (bool, bool, DWORD *) __attribute__ ((regparm (3)));
bool setup_overlapped () __attribute__ ((regparm (1))); bool setup_overlapped () __attribute__ ((regparm (1)));
void destroy_overlapped () __attribute__ ((regparm (1))); void destroy_overlapped () __attribute__ ((regparm (1)));

View File

@ -132,9 +132,10 @@ fhandler_fifo::wait (bool iswrite)
{ {
case fifo_wait_for_client: case fifo_wait_for_client:
bool res = ConnectNamedPipe (get_handle (), get_overlapped ()); bool res = ConnectNamedPipe (get_handle (), get_overlapped ());
DWORD dummy_bytes;
if (res || GetLastError () == ERROR_PIPE_CONNECTED) if (res || GetLastError () == ERROR_PIPE_CONNECTED)
return true; return true;
return wait_overlapped (res, iswrite, NULL); return wait_overlapped (res, iswrite, &dummy_bytes);
default: default:
break; break;
} }

View File

@ -490,7 +490,7 @@ fhandler_pipe::fstatvfs (struct statvfs *sfs)
return -1; return -1;
} }
#define DEFAULT_PIPEBUFSIZE (16 * PIPE_BUF) #define DEFAULT_PIPEBUFSIZE 65536
extern "C" int extern "C" int
pipe (int filedes[2]) pipe (int filedes[2])