From c43e9340f1bebe97d8e8ea683ec7f2bf911b5a85 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 27 Nov 2015 14:39:11 +0100 Subject: 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 --- winsup/cygwin/exceptions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'winsup/cygwin/exceptions.cc') diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 9119a8c08..c3a45d288 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -972,7 +972,7 @@ _cygtls::interrupt_setup (siginfo_t& si, void *handler, struct sigaction& siga) this->sig = si.si_signo; /* Should always be last thing set to avoid race */ if (incyg) - SetEvent (get_signal_arrived (false)); + set_signal_arrived (); if (!have_execed) proc_subproc (PROC_CLEARWAIT, 1); @@ -1404,7 +1404,7 @@ _cygtls::handle_SIGCONT () else { sig = SIGCONT; - SetEvent (signal_arrived); /* alert sig_handle_tty_stop */ + set_signal_arrived (); /* alert sig_handle_tty_stop */ sigsent = true; } /* Clear pending stop signals */ -- cgit v1.2.3