diff options
Diffstat (limited to 'winsup/cygwin/fhandler_tape.cc')
-rw-r--r-- | winsup/cygwin/fhandler_tape.cc | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc index 855fd5dfd..c394d862d 100644 --- a/winsup/cygwin/fhandler_tape.cc +++ b/winsup/cygwin/fhandler_tape.cc @@ -15,12 +15,7 @@ details. */ #include <stdlib.h> #include <sys/mtio.h> #include <sys/param.h> -#ifdef __MINGW64_VERSION_MAJOR -#include <devioctl.h> -#include <ntddstor.h> -#else #include <ddk/ntddstor.h> -#endif #include "security.h" #include "path.h" #include "fhandler.h" @@ -1147,13 +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; - switch (cancelable_wait (mt_mtx, timeout, cw_sig | cw_cancel | cw_cancel_self)) +restart: + 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; |