OLD | NEW |
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 "content/child/child_thread.h" | 5 #include "content/child/child_thread.h" |
6 | 6 |
7 #include <signal.h> | 7 #include <signal.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 | 113 |
114 class SuicideOnChannelErrorFilter : public IPC::MessageFilter { | 114 class SuicideOnChannelErrorFilter : public IPC::MessageFilter { |
115 public: | 115 public: |
116 // IPC::MessageFilter | 116 // IPC::MessageFilter |
117 virtual void OnChannelError() OVERRIDE { | 117 virtual void OnChannelError() OVERRIDE { |
118 // For renderer/worker processes: | 118 // For renderer/worker processes: |
119 // On POSIX, at least, one can install an unload handler which loops | 119 // On POSIX, at least, one can install an unload handler which loops |
120 // forever and leave behind a renderer process which eats 100% CPU forever. | 120 // forever and leave behind a renderer process which eats 100% CPU forever. |
121 // | 121 // |
122 // This is because the terminate signals (ViewMsg_ShouldClose and the error | 122 // This is because the terminate signals (ViewMsg_ShouldClose and the error |
123 // from the IPC channel) are routed to the main message loop but never | 123 // from the IPC sender) are routed to the main message loop but never |
124 // processed (because that message loop is stuck in V8). | 124 // processed (because that message loop is stuck in V8). |
125 // | 125 // |
126 // One could make the browser SIGKILL the renderers, but that leaves open a | 126 // One could make the browser SIGKILL the renderers, but that leaves open a |
127 // large window where a browser failure (or a user, manually terminating | 127 // large window where a browser failure (or a user, manually terminating |
128 // the browser because "it's stuck") will leave behind a process eating all | 128 // the browser because "it's stuck") will leave behind a process eating all |
129 // the CPU. | 129 // the CPU. |
130 // | 130 // |
131 // So, we install a filter on the channel so that we can process this event | 131 // So, we install a filter on the sender so that we can process this event |
132 // here and kill the process. | 132 // here and kill the process. |
133 // TODO(earthdok): Re-enable on CrOS http://crbug.com/360622 | 133 // TODO(earthdok): Re-enable on CrOS http://crbug.com/360622 |
134 #if (defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER) || \ | 134 #if (defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER) || \ |
135 defined(THREAD_SANITIZER)) && !defined(OS_CHROMEOS) | 135 defined(THREAD_SANITIZER)) && !defined(OS_CHROMEOS) |
136 // Some sanitizer tools rely on exit handlers (e.g. to run leak detection, | 136 // Some sanitizer tools rely on exit handlers (e.g. to run leak detection, |
137 // or dump code coverage data to disk). Instead of exiting the process | 137 // or dump code coverage data to disk). Instead of exiting the process |
138 // immediately, we give it 60 seconds to run exit handlers. | 138 // immediately, we give it 60 seconds to run exit handlers. |
139 CHECK(CreateWaitAndExitThread(base::TimeDelta::FromSeconds(60))); | 139 CHECK(CreateWaitAndExitThread(base::TimeDelta::FromSeconds(60))); |
140 #if defined(LEAK_SANITIZER) | 140 #if defined(LEAK_SANITIZER) |
141 // Invoke LeakSanitizer early to avoid detecting shutdown-only leaks. If | 141 // Invoke LeakSanitizer early to avoid detecting shutdown-only leaks. If |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 base::MessageLoop::current()->SetTimerSlack(timer_slack); | 561 base::MessageLoop::current()->SetTimerSlack(timer_slack); |
562 | 562 |
563 #ifdef OS_WIN | 563 #ifdef OS_WIN |
564 // Windows Vista+ has a fancy process backgrounding mode that can only be set | 564 // Windows Vista+ has a fancy process backgrounding mode that can only be set |
565 // from within the process. | 565 // from within the process. |
566 base::Process::Current().SetProcessBackgrounded(background); | 566 base::Process::Current().SetProcessBackgrounded(background); |
567 #endif // OS_WIN | 567 #endif // OS_WIN |
568 } | 568 } |
569 | 569 |
570 } // namespace content | 570 } // namespace content |
OLD | NEW |