* nsProfileLock is already rigged for handling signals and is already terminating (fatally) so it is only a small change to make it clean, this is preferable to a GTK-specific implementation.
* A clean quit should be performed for SIGINT and SIGTERM, but not SIGQUIT as it is not intended to be clean.
* nsAppStartup::Quit calls nsIAppShell::Exit asynchronously which does most of the work so it doesn't block the signal handler.
* raise() needs to be called at some point after calling Quit().
* To avoid SessionStore attempting to restore a crashed session, SessionFile needs to be closed properly, complete a final write, notify CrashMonitor with "sessionstore-final-state-write-complete" which then needs to write a checkpoint to a file asynchronously. This appears to happen before the observer notification "profile-change-teardown", even if it takes a long time, however documentation suggests the later notification "profile-before-change" is more appropriate.
This patch avoids SessionStore problems with SIGINT/SIGTERM by calling Quit(eForceQuit) in the nsProfileLock signal handler and observing "profile-before-change" for later raising the signal. As usual, if termination takes too long a second SIGINT/SIGTERM can be sent which causes immediate termination via the default handler and most systems have a timeout that will also eventually kill the process.
Created attachment 8626516
bug336193.patch
Summary:
* nsProfileLock is already rigged for handling signals and is already terminating (fatally) so it is only a small change to make it clean, this is preferable to a GTK-specific implementation. final-state- write-complete" which then needs to write a checkpoint to a file asynchronously. This appears to happen before the observer notification "profile- change- teardown" , even if it takes a long time, however documentation suggests the later notification "profile- before- change" is more appropriate.
* A clean quit should be performed for SIGINT and SIGTERM, but not SIGQUIT as it is not intended to be clean.
* nsAppStartup::Quit calls nsIAppShell::Exit asynchronously which does most of the work so it doesn't block the signal handler.
* raise() needs to be called at some point after calling Quit().
* To avoid SessionStore attempting to restore a crashed session, SessionFile needs to be closed properly, complete a final write, notify CrashMonitor with "sessionstore-
This patch avoids SessionStore problems with SIGINT/SIGTERM by calling Quit(eForceQuit) in the nsProfileLock signal handler and observing "profile- before- change" for later raising the signal. As usual, if termination takes too long a second SIGINT/SIGTERM can be sent which causes immediate termination via the default handler and most systems have a timeout that will also eventually kill the process.