diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-11-27 14:39:11 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-11-27 14:39:11 +0100 |
commit | c43e9340f1bebe97d8e8ea683ec7f2bf911b5a85 (patch) | |
tree | 22f894dae5dfa97f2938a2097baf1108f95eac06 /winsup/cygwin/posix_ipc.cc | |
parent | 9471b0b36da94b507196c4db9884ec48e1b3a41b (diff) | |
download | cygnal-c43e9340f1bebe97d8e8ea683ec7f2bf911b5a85.tar.gz cygnal-c43e9340f1bebe97d8e8ea683ec7f2bf911b5a85.tar.bz2 cygnal-c43e9340f1bebe97d8e8ea683ec7f2bf911b5a85.zip |
Fix race condition when waiting for a signal
* cygtls.h (_cygtls::wait_signal_arrived): Renamed from
set_signal_arrived.
(_cygtls::set_signal_arrived): New function signalling signal_arrived.
(_cygtls::reset_signal_arrived): Don't reset will_wait_for_signal.
(_cygtls::unwait_signal_arrived): New function only resetting
will_wait_for_signal.
(class wait_signal_arrived): Rename from set_signal_arrived.
Accommodate name change throughout Cygwin.
(wait_signal_arrived::~wait_signal_arrived): Call
_cygtls::unwait_signal_arrived. Add comment.
* cygserver_ipc.h (ipc_set_proc_info): Fetch signal_arrived handle
via call to _cygtls::get_signal_arrived.
* exceptions.cc (_cygtls::interrupt_setup): Signal signal_arrived via
call to _cygtls::set_signal_arrived.
(_cygtls::handle_SIGCONT): Ditto.
* fhandler_socket.cc (fhandler_socket::wait_for_events): Generate
WSAEVENT array prior to entering wait loop. Add cancel event object
if available. Remove calls to pthread_testcancel and just call
pthread::static_cancel_self if the cancel event object is signalled.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/posix_ipc.cc')
-rw-r--r-- | winsup/cygwin/posix_ipc.cc | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc index ef05dbc1c..e82c38526 100644 --- a/winsup/cygwin/posix_ipc.cc +++ b/winsup/cygwin/posix_ipc.cc @@ -178,7 +178,7 @@ ipc_cond_timedwait (HANDLE evt, HANDLE mtx, const struct timespec *abstime) DWORD timer_idx = 0; int ret = 0; - set_signal_arrived here (w4[1]); + wait_signal_arrived here (w4[1]); if ((w4[cnt] = pthread::get_cancel_event ()) != NULL) ++cnt; if (abstime) |