* 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:
Corinna Vinschen 2011-05-03 10:11:19 +00:00
parent 368ee04706
commit c402095aae
2 changed files with 12 additions and 5 deletions

View File

@ -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

View File

@ -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 ();