diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 912d44f7f..f648f9b45 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2012-06-25 Christopher Faylor + + * cygwait.cc (cancelable_wait): Make sure that timer is cancelled + before cancelling thread. + 2012-06-25 Christopher Faylor * cygwait.h (cancelable_wait): Need to force time to negative to diff --git a/winsup/cygwin/cygwait.cc b/winsup/cygwin/cygwait.cc index 9b22bd01f..f6eb0a3a7 100644 --- a/winsup/cygwin/cygwait.cc +++ b/winsup/cygwin/cygwait.cc @@ -72,17 +72,13 @@ cancelable_wait (HANDLE object, PLARGE_INTEGER timeout, unsigned mask) { res = WaitForMultipleObjects (num, wait_objects, FALSE, INFINITE); if (res == cancel_n) - { - if (is_cw_cancel_self) - pthread::static_cancel_self (); - res = WAIT_CANCELED; - } + res = WAIT_CANCELED; else if (res == timeout_n) res = WAIT_TIMEOUT; else if (res != sig_n) /* all set */; else if (is_cw_sig_eintr) - res = WAIT_SIGNALED; + res = WAIT_SIGNALED; /* caller will deal with signals */ else if (_my_tls.call_signal_handler () || &_my_tls != _main_tls) continue; break; @@ -101,5 +97,8 @@ cancelable_wait (HANDLE object, PLARGE_INTEGER timeout, unsigned mask) NtCancelTimer (_my_tls.locals.cw_timer, NULL); } + if (res == WAIT_CANCELED && is_cw_cancel_self) + pthread::static_cancel_self (); + return res; }