diff options
author | Christopher Faylor <me@cgf.cx> | 2012-06-19 04:38:02 +0400 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2012-06-19 04:38:02 +0400 |
commit | 2addde8cb1e794a9818b9417839524dbc05401da (patch) | |
tree | 389e9271ffc3ea88d97116b52fa8e838889ab12f /winsup/cygwin/fhandler_tape.cc | |
parent | af5cd145835d35519af02d0d226f67eb777e4945 (diff) |
Revert errneous checkin.
Check in actual change associated with ChangeLog.
Diffstat (limited to 'winsup/cygwin/fhandler_tape.cc')
-rw-r--r-- | winsup/cygwin/fhandler_tape.cc | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc index 2e936c3b1..c394d862d 100644 --- a/winsup/cygwin/fhandler_tape.cc +++ b/winsup/cygwin/fhandler_tape.cc @@ -1142,14 +1142,26 @@ mtinfo::initialize () inline bool fhandler_dev_tape::_lock (bool cancelable) { + HANDLE w4[3] = { mt_mtx, signal_arrived, NULL }; + DWORD cnt = 2; + if (cancelable && (w4[2] = pthread::get_cancel_event ()) != NULL) + cnt = 3; /* O_NONBLOCK is only valid in a read or write call. Only those are cancelable. */ DWORD timeout = cancelable && is_nonblocking () ? 0 : INFINITE; restart: - switch (cancelable_wait (mt_mtx, timeout, cw_sig | cw_cancel | cw_cancel_self)) + switch (WaitForMultipleObjects (cnt, w4, FALSE, timeout)) { case WAIT_OBJECT_0: return true; + case WAIT_OBJECT_0 + 1: + if (_my_tls.call_signal_handler ()) + goto restart; + set_errno (EINTR); + return false; + case WAIT_OBJECT_0 + 2: + pthread::static_cancel_self (); + /*NOTREACHED*/ case WAIT_TIMEOUT: set_errno (EAGAIN); return false; |