Comment 54 for bug 73536

Revision history for this message
In , Plurtu (plurtu) wrote :

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.
 * 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.