* 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:
parent
ec8a7e416f
commit
fbf39a58cb
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)));
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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])
|
||||||
|
|
Loading…
Reference in New Issue