* fhandler.cc (fhandler_base_overlapped::wait_overlapped): Make
cancelable. Remove test for main thread, always add signal_arrived to waited objects.
This commit is contained in:
parent
368ee04706
commit
c402095aae
@ -1,3 +1,9 @@
|
|||||||
|
2011-05-03 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler.cc (fhandler_base_overlapped::wait_overlapped): Make
|
||||||
|
cancelable. Remove test for main thread, always add signal_arrived
|
||||||
|
to waited objects.
|
||||||
|
|
||||||
2011-05-03 Corinna Vinschen <corinna@vinschen.de>
|
2011-05-03 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_tty.cc (fhandler_tty_slave::read): Set WFMO timeout to 0 for
|
* fhandler_tty.cc (fhandler_tty_slave::read): Set WFMO timeout to 0 for
|
||||||
|
@ -1754,11 +1754,9 @@ fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *byte
|
|||||||
if (!get_overlapped ()->hEvent)
|
if (!get_overlapped ()->hEvent)
|
||||||
system_printf ("hEvent is zero?");
|
system_printf ("hEvent is zero?");
|
||||||
#endif
|
#endif
|
||||||
DWORD n = 1;
|
HANDLE w4[3] = { get_overlapped ()->hEvent, signal_arrived,
|
||||||
HANDLE w4[2];
|
pthread::get_cancel_event () };
|
||||||
w4[0] = get_overlapped ()->hEvent;
|
DWORD n = w4[2] ? 3 : 2;
|
||||||
if (&_my_tls == _main_tls)
|
|
||||||
w4[n++] = signal_arrived;
|
|
||||||
HANDLE h = writing ? get_output_handle () : get_handle ();
|
HANDLE h = writing ? get_output_handle () : get_handle ();
|
||||||
DWORD wfres = WaitForMultipleObjects (n, w4, false, INFINITE);
|
DWORD wfres = WaitForMultipleObjects (n, w4, false, INFINITE);
|
||||||
if (wfres != WAIT_OBJECT_0)
|
if (wfres != WAIT_OBJECT_0)
|
||||||
@ -1766,6 +1764,7 @@ fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *byte
|
|||||||
*bytes = 0;
|
*bytes = 0;
|
||||||
BOOL wores = GetOverlappedResult (h, get_overlapped (), bytes, false);
|
BOOL wores = GetOverlappedResult (h, get_overlapped (), bytes, false);
|
||||||
bool signalled = !wores && (wfres == WAIT_OBJECT_0 + 1);
|
bool signalled = !wores && (wfres == WAIT_OBJECT_0 + 1);
|
||||||
|
bool canceled = !wores && (wfres == WAIT_OBJECT_0 + 2);
|
||||||
if (signalled)
|
if (signalled)
|
||||||
{
|
{
|
||||||
debug_printf ("got a signal");
|
debug_printf ("got a signal");
|
||||||
@ -1779,6 +1778,8 @@ fhandler_base_overlapped::wait_overlapped (bool inres, bool writing, DWORD *byte
|
|||||||
*bytes = (DWORD) -1;
|
*bytes = (DWORD) -1;
|
||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
|
else if (canceled)
|
||||||
|
pthread::static_cancel_self ();
|
||||||
else if (!wores)
|
else if (!wores)
|
||||||
{
|
{
|
||||||
err = GetLastError ();
|
err = GetLastError ();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user