bug#14569: 24.3.50; bootstrap fails on Cygwin

Paul Eggert eggert@cs.ucla.edu
Fri Jun 14 17:45:00 GMT 2013


Cygwin developers, I'm worried about a Cygwin bug where
pthread_kill may not send a signal to the correct thread.
This bug may be causing Emacs to crash. The Cygwin bug is
discussed in this thread:
http://cygwin.com/ml/cygwin/2012-05/msg00472.html
Emacs uses pthread_kill to redirect
SIGCHLD to the main thread; if this is sent to a random
thread instead, that could explain the random crashes.
My question is: does this bug still exist with Cygwin,
and if so is it likely to get fixed soon?
More details about the Emacs bug can be found here:
 http://bugs.gnu.org/14569
Briefly, Emacs is crashing randomly on Cygwin ever since it started
doing this:
 /* Tickle glib's child-handling code. Ask glib to wait for Emacs itself;
 this should always fail, but is enough to initialize glib's 
 private SIGCHLD handler. */
 g_source_unref (g_child_watch_source_new (getpid ()));
After this newly-inserted code, Emacs finds out what the
child signal handler was:
 /* Now, find out what glib's signal handler was, and store it
 into lib_child_handler. */
 struct sigaction action, old_action;
 emacs_sigaction_init (&action, deliver_child_signal);
 sigaction (SIGCHLD, &action, &old_action);
 eassert (! (old_action.sa_flags & SA_SIGINFO));
 if (old_action.sa_handler != SIG_DFL && old_action.sa_handler != SIG_IGN
 && old_action.sa_handler != deliver_child_signal)
 lib_child_handler = old_action.sa_handler;
Emacs's SIGCHILD handler, deliver_child_signal, arranges the
signal handling to occur in the main thread (to avoid races
within Emacs), like this:
 int old_errno = errno;
 bool on_main_thread = true;
 if (! pthread_equal (pthread_self (), main_thread))
 {
 sigset_t blocked;
 sigemptyset (&blocked);
 sigaddset (&blocked, sig);
 pthread_sigmask (SIG_BLOCK, &blocked, 0);
 pthread_kill (main_thread, sig);
 on_main_thread = false;
 }
 if (on_main_thread)
 handle_child_signal (sig);
 errno = old_errno;
And handle_child_signal, which runs in the main thread, does
a bunch of Emacsish things and then invokes lib_child_handler (sig),
which is glib's SIGCHLD handler.
All this works just fine on Fedora and other platforms; but it
doesn't work on Cygwin.
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /