Index: chromecast/browser/cast_browser_main_parts.cc |
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc |
index 14f23316fdbcb325950edcc800116b23e304fcae..a7037237f5597bd379f74cb2d154dc846f700525 100644 |
--- a/chromecast/browser/cast_browser_main_parts.cc |
+++ b/chromecast/browser/cast_browser_main_parts.cc |
@@ -5,6 +5,7 @@ |
#include "chromecast/browser/cast_browser_main_parts.h" |
#include <stddef.h> |
+#include <string.h> |
#include <string> |
@@ -76,15 +77,21 @@ namespace { |
#if !defined(OS_ANDROID) |
int kSignalsToRunClosure[] = { SIGTERM, SIGINT, }; |
- |
// Closure to run on SIGTERM and SIGINT. |
-base::Closure* g_signal_closure = NULL; |
+base::Closure* g_signal_closure = nullptr; |
+base::PlatformThreadId g_main_thread_id; |
void RunClosureOnSignal(int signum) { |
- LOG(ERROR) << "Got signal " << signum; |
+ if (base::PlatformThread::CurrentId() != g_main_thread_id) { |
+ RAW_LOG(INFO, "Received signal on non-main thread\n"); |
+ return; |
+ } |
+ |
+ char message[48] = "Received close signal: "; |
+ strncat(message, sys_siglist[signum], sizeof(message) - strlen(message) - 1); |
maclellant
2015/12/29 18:36:14
I was about to reply that string library functions
|
+ RAW_LOG(INFO, message); |
+ |
DCHECK(g_signal_closure); |
- // Expect main thread got this signal. Otherwise, weak_ptr of run_loop will |
- // crash the process. |
g_signal_closure->Run(); |
} |
@@ -92,8 +99,10 @@ void RegisterClosureOnSignal(const base::Closure& closure) { |
DCHECK(!g_signal_closure); |
DCHECK_GT(arraysize(kSignalsToRunClosure), 0U); |
- // Allow memory leak by intention. |
+ // Memory leak on purpose, since |g_signal_closure| should live until |
+ // process exit. |
g_signal_closure = new base::Closure(closure); |
+ g_main_thread_id = base::PlatformThread::CurrentId(); |
struct sigaction sa_new; |
memset(&sa_new, 0, sizeof(sa_new)); |
@@ -101,9 +110,9 @@ void RegisterClosureOnSignal(const base::Closure& closure) { |
sigfillset(&sa_new.sa_mask); |
sa_new.sa_flags = SA_RESTART; |
- for (size_t i = 0; i < arraysize(kSignalsToRunClosure); i++) { |
+ for (int sig : kSignalsToRunClosure) { |
struct sigaction sa_old; |
- if (sigaction(kSignalsToRunClosure[i], &sa_new, &sa_old) == -1) { |
+ if (sigaction(sig, &sa_new, &sa_old) == -1) { |
NOTREACHED(); |
} else { |
DCHECK_EQ(sa_old.sa_handler, SIG_DFL); |