Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: chrome/browser/chrome_browser_main_posix.cc

Issue 12314106: [Mac] Do not forward graceful shutdown from child signal handlers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chrome_browser_main_posix.h" 5 #include "chrome/browser/chrome_browser_main_posix.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <limits.h> 8 #include <limits.h>
9 #include <pthread.h> 9 #include <pthread.h>
10 #include <signal.h> 10 #include <signal.h>
(...skipping 22 matching lines...) Expand all
33 #endif 33 #endif
34 34
35 using content::BrowserThread; 35 using content::BrowserThread;
36 36
37 namespace { 37 namespace {
38 38
39 // See comment in |PreEarlyInitialization()|, where sigaction is called. 39 // See comment in |PreEarlyInitialization()|, where sigaction is called.
40 void SIGCHLDHandler(int signal) { 40 void SIGCHLDHandler(int signal) {
41 } 41 }
42 42
43 // The OSX fork() implementation can crash in the child process before
44 // fork() returns. In that case, the shutdown pipe will still be
45 // shared with the parent process. To prevent child crashes from
46 // causing parent shutdowns, |g_pipe_pid| is the pid for the process
47 // which registered |g_shutdown_pipe_write_fd|.
viettrungluu 2013/02/25 23:15:06 Could you include a reference to the bug(s)?
Scott Hess - ex-Googler 2013/02/25 23:20:46 Done.
48 pid_t g_pipe_pid = -1;
43 int g_shutdown_pipe_write_fd = -1; 49 int g_shutdown_pipe_write_fd = -1;
44 int g_shutdown_pipe_read_fd = -1; 50 int g_shutdown_pipe_read_fd = -1;
45 51
46 // Common code between SIG{HUP, INT, TERM}Handler. 52 // Common code between SIG{HUP, INT, TERM}Handler.
47 void GracefulShutdownHandler(int signal) { 53 void GracefulShutdownHandler(int signal) {
48 // Reinstall the default handler. We had one shot at graceful shutdown. 54 // Reinstall the default handler. We had one shot at graceful shutdown.
49 struct sigaction action; 55 struct sigaction action;
50 memset(&action, 0, sizeof(action)); 56 memset(&action, 0, sizeof(action));
51 action.sa_handler = SIG_DFL; 57 action.sa_handler = SIG_DFL;
52 RAW_CHECK(sigaction(signal, &action, NULL) == 0); 58 RAW_CHECK(sigaction(signal, &action, NULL) == 0);
53 59
60 RAW_CHECK(g_pipe_pid == getpid());
54 RAW_CHECK(g_shutdown_pipe_write_fd != -1); 61 RAW_CHECK(g_shutdown_pipe_write_fd != -1);
55 RAW_CHECK(g_shutdown_pipe_read_fd != -1); 62 RAW_CHECK(g_shutdown_pipe_read_fd != -1);
56 size_t bytes_written = 0; 63 size_t bytes_written = 0;
57 do { 64 do {
58 int rv = HANDLE_EINTR( 65 int rv = HANDLE_EINTR(
59 write(g_shutdown_pipe_write_fd, 66 write(g_shutdown_pipe_write_fd,
60 reinterpret_cast<const char*>(&signal) + bytes_written, 67 reinterpret_cast<const char*>(&signal) + bytes_written,
61 sizeof(signal) - bytes_written)); 68 sizeof(signal) - bytes_written));
62 RAW_CHECK(rv >= 0); 69 RAW_CHECK(rv >= 0);
63 bytes_written += rv; 70 bytes_written += rv;
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 void ChromeBrowserMainPartsPosix::PostMainMessageLoopStart() { 301 void ChromeBrowserMainPartsPosix::PostMainMessageLoopStart() {
295 ChromeBrowserMainParts::PostMainMessageLoopStart(); 302 ChromeBrowserMainParts::PostMainMessageLoopStart();
296 303
297 int pipefd[2]; 304 int pipefd[2];
298 int ret = pipe(pipefd); 305 int ret = pipe(pipefd);
299 if (ret < 0) { 306 if (ret < 0) {
300 PLOG(DFATAL) << "Failed to create pipe"; 307 PLOG(DFATAL) << "Failed to create pipe";
301 } else { 308 } else {
302 g_shutdown_pipe_read_fd = pipefd[0]; 309 g_shutdown_pipe_read_fd = pipefd[0];
303 g_shutdown_pipe_write_fd = pipefd[1]; 310 g_shutdown_pipe_write_fd = pipefd[1];
311 g_pipe_pid = getpid();
viettrungluu 2013/02/25 23:15:06 Nit: You may as well initialize these in the same
Scott Hess - ex-Googler 2013/02/25 23:20:46 Done. I was not willing to initialize the write f
304 #if !defined(ADDRESS_SANITIZER) && !defined(KEEP_SHADOW_STACKS) 312 #if !defined(ADDRESS_SANITIZER) && !defined(KEEP_SHADOW_STACKS)
305 const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN; 313 const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN;
306 #else 314 #else
307 // ASan instrumentation and -finstrument-functions (used for keeping the 315 // ASan instrumentation and -finstrument-functions (used for keeping the
308 // shadow stacks) bloat the stack frames, so we need to increase the stack 316 // shadow stacks) bloat the stack frames, so we need to increase the stack
309 // size to avoid hitting the guard page. 317 // size to avoid hitting the guard page.
310 const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4; 318 const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4;
311 #endif 319 #endif
312 // TODO(viettrungluu,willchan): crbug.com/29675 - This currently leaks, so 320 // TODO(viettrungluu,willchan): crbug.com/29675 - This currently leaks, so
313 // if you change this, you'll probably need to change the suppression. 321 // if you change this, you'll probably need to change the suppression.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 ChromeBrowserMainExtraPartsGtk::ShowMessageBox( 363 ChromeBrowserMainExtraPartsGtk::ShowMessageBox(
356 chrome_browser::kMissingLocaleDataMessage); 364 chrome_browser::kMissingLocaleDataMessage);
357 #elif defined(USE_AURA) 365 #elif defined(USE_AURA)
358 // TODO(port): We may want a views based message dialog here eventually, but 366 // TODO(port): We may want a views based message dialog here eventually, but
359 // for now, crash. 367 // for now, crash.
360 NOTREACHED(); 368 NOTREACHED();
361 #else 369 #else
362 #error "Need MessageBox implementation." 370 #error "Need MessageBox implementation."
363 #endif 371 #endif
364 } 372 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698