* fhandler.h (fhandler_base_setup_overlapped): Add new argument.

(fhandler_base::get_overlapped_buffer): Declare new function.
(fhandler_base::set_overlapped): Ditto.
(fhandler_pipe::overlapped): New variable.
(fhandler_pipe::get_overlapped): Rework to return contents of overlapped
variable.
(fhandler_pipe::set_overlapped): Set overlapped variable based on argument.
(fhandler_fifo::get_overlapped_buffer): Return pointer to io_status.
* fhandler.cc (handler_base::setup_overlapped): Set to overlapped pointer to
NULL if new doit parameter is false.  Otherwise set up overlapped event as
usual.
(fhandler_base::wait_overlapped): Return inres if this isn't an overlapped
operation.
(fhandler_base::read_overlapped): Remove inappropriate asserts.
* pipe.cc (fhandler_pipe::fhandler_pipe): Zero overlapped element.
(struct pipesync): Delete.
(getov_result): Ditto.
(pipe_handler): Ditto.
(pipesync::pipesync): Ditto.
(fhandler_pipe::init): Don't set up pipesync thread.  Just pass opened_properly
flag along to overlapped setup.
This commit is contained in:
Christopher Faylor
2008-12-23 18:22:33 +00:00
parent a432f50100
commit 9a8597c13a
4 changed files with 55 additions and 143 deletions

View File

@ -1661,11 +1661,22 @@ fhandler_base::fpathconf (int v)
/* Overlapped I/O */
bool
fhandler_base::setup_overlapped ()
fhandler_base::setup_overlapped (bool doit)
{
OVERLAPPED *ov = get_overlapped ();
OVERLAPPED *ov = get_overlapped_buffer ();
memset (ov, 0, sizeof (*ov));
return (ov->hEvent = CreateEvent (&sec_none_nih, true, false, NULL));
bool res;
if (doit)
{
set_overlapped (ov);
res = !!(ov->hEvent = CreateEvent (&sec_none_nih, true, false, NULL));
}
else
{
set_overlapped (NULL);
res = false;
}
return res;
}
void
@ -1682,6 +1693,9 @@ fhandler_base::destroy_overlapped ()
int
fhandler_base::wait_overlapped (bool inres, bool writing, DWORD *bytes)
{
if (!get_overlapped ())
return inres;
int res = 0;
*bytes = (DWORD) -1;
DWORD err;
@ -1753,10 +1767,6 @@ fhandler_base::wait_overlapped (bool inres, bool writing, DWORD *bytes)
void
fhandler_base::read_overlapped (void *ptr, size_t& len)
{
#ifdef DEBUGGING
assert (get_overlapped ());
assert (get_overlapped ()->hEvent);
#endif
while (1)
{
bool res = ReadFile (get_handle (), ptr, len, (DWORD *) &len,