Guard against the non-existence of SIGHUP.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_3_X@9501 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2005-01-19 14:18:10 +00:00
parent e5f569c8d4
commit 1a001ee559
2 changed files with 45 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2005-01-19 Angus Leeming <leeming@lyx.org>
* lyx_main.C (error_handler, init): protect SIGHUP with
#ifndef _WIN32 guards.
2005-01-19 Jean-Marc Lasgouttes <lasgouttes@lyx.org>
* LaTeXFeatures.C: rename feature "wasy" to "wasysym".

View File

@ -180,14 +180,46 @@ LyX::LyX(int & argc, char * argv[])
}
/*
Signals and Windows
===================
The SIGHUP signal does not exist on Windows and does not need to be handled.
Windows handles SIGFPE and SIGSEGV signals as expected.
Cntl+C interrupts (mapped to SIGINT by Windows' POSIX compatability layer)
cause a new thread to be spawned. This may well result in unexpected
behaviour by the single-threaded LyX.
SIGTERM signals will come only from another process actually sending
that signal using 'raise' in Windows' POSIX compatability layer. It will
not come from the general "terminate process" methods that everyone
actually uses (and which can't be trapped). Killing an app 'politely' on
Windows involves first sending a WM_CLOSE message, something that is
caught already by the Qt frontend.
For more information see:
http://aspn.activestate.com/ASPN/Mail/Message/ActiveTcl/2034055
...signals are mostly useless on Windows for a variety of reasons that are
Windows specific...
'UNIX Application Migration Guide, Chapter 9'
http://msdn.microsoft.com/library/en-us/dnucmg/html/UCMGch09.asp
'How To Terminate an Application "Cleanly" in Win32'
http://support.microsoft.com/default.aspx?scid=kb;en-us;178893
*/
extern "C" {
static void error_handler(int err_sig)
{
switch (err_sig) {
#ifdef SIGHUP
case SIGHUP:
lyxerr << "\nlyx: SIGHUP signal caught" << endl;
break;
#endif
case SIGINT:
// no comments
break;
@ -208,7 +240,9 @@ static void error_handler(int err_sig)
}
// Deinstall the signal handlers
#ifdef SIGHUP
signal(SIGHUP, SIG_DFL);
#endif
signal(SIGINT, SIG_DFL);
signal(SIGFPE, SIG_DFL);
signal(SIGSEGV, SIG_DFL);
@ -217,8 +251,12 @@ static void error_handler(int err_sig)
LyX::emergencyCleanup();
lyxerr << "Bye." << endl;
#ifdef SIGHUP
if (err_sig!= SIGHUP &&
(!GetEnv("LYXDEBUG").empty() || err_sig == SIGSEGV))
#else
if (err_sig == SIGSEGV || !GetEnv("LYXDEBUG").empty())
#endif
lyx::abort();
exit(0);
}
@ -228,7 +266,9 @@ static void error_handler(int err_sig)
void LyX::init(bool gui)
{
#ifdef SIGHUP
signal(SIGHUP, error_handler);
#endif
signal(SIGFPE, error_handler);
signal(SIGSEGV, error_handler);
signal(SIGINT, error_handler);