diff options
author | cmasone@google.com <cmasone@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-07 03:09:33 +0000 |
---|---|---|
committer | cmasone@google.com <cmasone@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-07 03:09:33 +0000 |
commit | edb7c860f97a0fadc7cda85b5a4581941a7f00bf (patch) | |
tree | a6100359380ee849545fad19bbe68db5972dbb21 /chrome/browser/browser_main.cc | |
parent | 1f070f059c645668e6b0446b726f5a08613c20d0 (diff) | |
download | chromium_src-edb7c860f97a0fadc7cda85b5a4581941a7f00bf.zip chromium_src-edb7c860f97a0fadc7cda85b5a4581941a7f00bf.tar.gz chromium_src-edb7c860f97a0fadc7cda85b5a4581941a7f00bf.tar.bz2 |
Adding a SIGTERM handler for OS_POSIX builds. This is needed so that Chrome can shut down gracefully when many posix-based system halt or reboot while Chrome is open.
SIGTERM may come in on any thread, so the handler creates a Task object that wraps up a call to BrowserList::CloseAllBrowsers(true) and Posts it to the message loop of the UI thread. Thus, we both get out of the signal handler quickly and can deal with the signal on any thread.
BUG=23551
TEST=covered by BrowserTest.PosixSessionEnd
Review URL: http://codereview.chromium.org/255036
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28225 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_main.cc')
-rw-r--r-- | chrome/browser/browser_main.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 03ee3f9..2bb6981 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -159,6 +159,24 @@ void RunUIMessageLoop(BrowserProcess* browser_process) { void SIGCHLDHandler(int signal) { } +// See comment below, where sigaction is called. +void SIGTERMHandler(int signal) { + DCHECK_EQ(signal, SIGTERM); + LOG(WARNING) << "Addressing SIGTERM on " << PlatformThread::CurrentId(); + MessageLoop* main_loop = ChromeThread::GetMessageLoop(ChromeThread::UI); + if (main_loop) { + main_loop->PostTask(FROM_HERE, + NewRunnableFunction( + BrowserList::CloseAllBrowsers, true)); + } + // Reinstall the default handler. We had one shot at graceful shutdown. + LOG(WARNING) << "Posted task to UI thread; resetting SIGTERM handler."; + struct sigaction term_action; + memset(&term_action, 0, sizeof(term_action)); + term_action.sa_handler = SIG_DFL; + CHECK(sigaction(SIGTERM, &term_action, NULL) == 0); +} + // Sets the file descriptor soft limit to |max_descriptors| or the OS hard // limit, whichever is lower. void SetFileDescriptorLimit(unsigned int max_descriptors) { @@ -237,6 +255,13 @@ int BrowserMain(const MainFunctionParams& parameters) { action.sa_handler = SIGCHLDHandler; CHECK(sigaction(SIGCHLD, &action, NULL) == 0); + // We need to handle SIGTERM, because that is how many POSIX-based distros ask + // processes to quit gracefully at shutdown time. + struct sigaction term_action; + memset(&term_action, 0, sizeof(term_action)); + term_action.sa_handler = SIGTERMHandler; + CHECK(sigaction(SIGTERM, &term_action, NULL) == 0); + const std::wstring fd_limit_string = parsed_command_line.GetSwitchValue(switches::kFileDescriptorLimit); int fd_limit = 0; |