Throughout, change fhandler_*::read and fhandler_*::raw_read to void functions

whose second arguments are both the lenght and the return value.
* fhandler.cc (fhandler_base::read): Rework slightly to use second argument as
input/output.  Tweak CRLF stuff.
(fhandler_base::readv): Accommodate fhandler_*::read changes.
* cygthread.h (cygthread::detach): Declare as taking optional handle argument.
(cygthread::detach): When given a handle argument, wait for the handle to be
signalled before waiting for thread to detach.  Return true when signal
detected.
This commit is contained in:
Christopher Faylor
2002-12-14 04:01:32 +00:00
parent ec085641a9
commit 8bce0d723c
19 changed files with 294 additions and 188 deletions

View File

@@ -268,9 +268,10 @@ cygthread::terminate_thread ()
theory is that cygthreads are only associated with one thread.
So, there should be no problems with multiple threads doing waits
on the one cygthread. */
void
cygthread::detach (bool wait_for_sig)
bool
cygthread::detach (HANDLE sigwait)
{
bool signalled = false;
if (avail)
system_printf ("called detach on available thread %d?", avail);
else
@@ -278,24 +279,32 @@ cygthread::detach (bool wait_for_sig)
DWORD avail = id;
DWORD res;
if (!wait_for_sig)
if (!sigwait)
res = WaitForSingleObject (*this, INFINITE);
else
{
HANDLE w4[2];
w4[0] = signal_arrived;
w4[1] = *this;
res = WaitForSingleObject (sigwait, INFINITE);
if (res != WAIT_OBJECT_0)
system_printf ("WFSO sigwait failed, res %u", res);
res = WaitForMultipleObjects (2, w4, FALSE, INFINITE);
if (res == WAIT_OBJECT_0)
if (res != WAIT_OBJECT_0)
/* nothing */;
else if (WaitForSingleObject (sigwait, 5) == WAIT_OBJECT_0)
res = WaitForSingleObject (*this, INFINITE);
else
{
terminate_thread ();
set_errno (EINTR); /* caller should be dealing with return
values. */
avail = 0;
signalled = true;
}
}
thread_printf ("%s returns %d, id %p", wait_for_sig ? "WFMO" : "WFSO",
thread_printf ("%s returns %d, id %p", sigwait ? "WFMO" : "WFSO",
res, id);
if (!avail)
@@ -312,6 +321,7 @@ cygthread::detach (bool wait_for_sig)
(void) InterlockedExchange ((LPLONG) &this->avail, avail);
}
}
return signalled;
}
void