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 // Represents the browser side of the browser <--> renderer communication | 5 // Represents the browser side of the browser <--> renderer communication |
6 // channel. There will be one RenderProcessHost per renderer process. | 6 // channel. There will be one RenderProcessHost per renderer process. |
7 | 7 |
8 #include "content/browser/renderer_host/render_process_host_impl.h" | 8 #include "content/browser/renderer_host/render_process_host_impl.h" |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
350 g_all_hosts.Get().set_check_on_null_data(true); | 350 g_all_hosts.Get().set_check_on_null_data(true); |
351 // Initialize |child_process_activity_time_| to a reasonable value. | 351 // Initialize |child_process_activity_time_| to a reasonable value. |
352 mark_child_process_activity_time(); | 352 mark_child_process_activity_time(); |
353 // Note: When we create the RenderProcessHostImpl, it's technically | 353 // Note: When we create the RenderProcessHostImpl, it's technically |
354 // backgrounded, because it has no visible listeners. But the process | 354 // backgrounded, because it has no visible listeners. But the process |
355 // doesn't actually exist yet, so we'll Background it later, after | 355 // doesn't actually exist yet, so we'll Background it later, after |
356 // creation. | 356 // creation. |
357 } | 357 } |
358 | 358 |
359 RenderProcessHostImpl::~RenderProcessHostImpl() { | 359 RenderProcessHostImpl::~RenderProcessHostImpl() { |
360 DCHECK(!run_renderer_in_process()); | |
360 ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID()); | 361 ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID()); |
361 | 362 |
362 // We may have some unsent messages at this point, but that's OK. | 363 // We may have some unsent messages at this point, but that's OK. |
363 channel_.reset(); | 364 channel_.reset(); |
364 while (!queued_messages_.empty()) { | 365 while (!queued_messages_.empty()) { |
365 delete queued_messages_.front(); | 366 delete queued_messages_.front(); |
366 queued_messages_.pop(); | 367 queued_messages_.pop(); |
367 } | 368 } |
368 | 369 |
369 if (run_renderer_in_process()) { | |
370 // In single process mode, need to set IO allowed in browser main thread | |
371 // before joining the renderer thread | |
372 base::ThreadRestrictions::ScopedAllowIO allow_io; | |
373 in_process_renderer_.reset(); | |
374 } | |
375 | |
376 ClearTransportDIBCache(); | 370 ClearTransportDIBCache(); |
377 UnregisterHost(GetID()); | 371 UnregisterHost(GetID()); |
378 } | 372 } |
379 | 373 |
380 void RenderProcessHostImpl::EnableSendQueue() { | 374 void RenderProcessHostImpl::EnableSendQueue() { |
381 is_initialized_ = false; | 375 is_initialized_ = false; |
382 } | 376 } |
383 | 377 |
384 bool RenderProcessHostImpl::Init() { | 378 bool RenderProcessHostImpl::Init() { |
385 // calling Init() more than once does nothing, this makes it more convenient | 379 // calling Init() more than once does nothing, this makes it more convenient |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
869 return base::Process::Current().handle(); | 863 return base::Process::Current().handle(); |
870 | 864 |
871 if (!child_process_launcher_.get() || child_process_launcher_->IsStarting()) | 865 if (!child_process_launcher_.get() || child_process_launcher_->IsStarting()) |
872 return base::kNullProcessHandle; | 866 return base::kNullProcessHandle; |
873 | 867 |
874 return child_process_launcher_->GetHandle(); | 868 return child_process_launcher_->GetHandle(); |
875 } | 869 } |
876 | 870 |
877 bool RenderProcessHostImpl::FastShutdownIfPossible() { | 871 bool RenderProcessHostImpl::FastShutdownIfPossible() { |
878 if (run_renderer_in_process()) | 872 if (run_renderer_in_process()) |
879 return false; // Single process mode can't do fast shutdown. | 873 return false; // Single process mode never shutdown the renderer. |
880 | 874 |
881 if (!GetContentClient()->browser()->IsFastShutdownPossible()) | 875 if (!GetContentClient()->browser()->IsFastShutdownPossible()) |
882 return false; | 876 return false; |
883 | 877 |
884 if (!child_process_launcher_.get() || | 878 if (!child_process_launcher_.get() || |
885 child_process_launcher_->IsStarting() || | 879 child_process_launcher_->IsStarting() || |
886 !GetHandle()) | 880 !GetHandle()) |
887 return false; // Render process hasn't started or is probably crashed. | 881 return false; // Render process hasn't started or is probably crashed. |
888 | 882 |
889 // Test if there's an unload listener. | 883 // Test if there's an unload listener. |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1126 *CommandLine::ForCurrentProcess(); | 1120 *CommandLine::ForCurrentProcess(); |
1127 if (browser_command_line.HasSwitch(switches::kAuditHandles) || | 1121 if (browser_command_line.HasSwitch(switches::kAuditHandles) || |
1128 browser_command_line.HasSwitch(switches::kAuditAllHandles)) { | 1122 browser_command_line.HasSwitch(switches::kAuditAllHandles)) { |
1129 DumpHandles(); | 1123 DumpHandles(); |
1130 | 1124 |
1131 // We wait to close the channels until the child process has finished | 1125 // We wait to close the channels until the child process has finished |
1132 // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone. | 1126 // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone. |
1133 return; | 1127 return; |
1134 } | 1128 } |
1135 #endif | 1129 #endif |
1136 Cleanup(); | 1130 // Keep the one renderer thread around forever in single process mode. |
Jeffrey Yasskin
2012/12/14 22:10:51
I'm now seeing a DCHECK-failure when running `xvfb
joth
2012/12/14 22:34:12
Good question. Most of the logic in the DestroyPro
| |
1131 if (!run_renderer_in_process()) | |
1132 Cleanup(); | |
1137 } | 1133 } |
1138 | 1134 |
1139 void RenderProcessHostImpl::Cleanup() { | 1135 void RenderProcessHostImpl::Cleanup() { |
1140 // When no other owners of this object, we can delete ourselves | 1136 // When no other owners of this object, we can delete ourselves |
1141 if (render_widget_hosts_.IsEmpty()) { | 1137 if (render_widget_hosts_.IsEmpty()) { |
1142 DCHECK_EQ(0, pending_views_); | 1138 DCHECK_EQ(0, pending_views_); |
1143 NotificationService::current()->Notify( | 1139 NotificationService::current()->Notify( |
1144 NOTIFICATION_RENDERER_PROCESS_TERMINATED, | 1140 NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
1145 Source<RenderProcessHost>(this), | 1141 Source<RenderProcessHost>(this), |
1146 NotificationService::NoDetails()); | 1142 NotificationService::NoDetails()); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1479 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget)); | 1475 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget)); |
1480 if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out()) | 1476 if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out()) |
1481 num_active_views++; | 1477 num_active_views++; |
1482 } | 1478 } |
1483 return num_active_views; | 1479 return num_active_views; |
1484 } | 1480 } |
1485 | 1481 |
1486 void RenderProcessHostImpl::OnShutdownRequest() { | 1482 void RenderProcessHostImpl::OnShutdownRequest() { |
1487 // Don't shut down if there are more active RenderViews than the one asking | 1483 // Don't shut down if there are more active RenderViews than the one asking |
1488 // to close, or if there are pending RenderViews being swapped back in. | 1484 // to close, or if there are pending RenderViews being swapped back in. |
1485 // In single process mode, we never shutdown the renderer. | |
1489 int num_active_views = GetActiveViewCount(); | 1486 int num_active_views = GetActiveViewCount(); |
1490 if (pending_views_ || num_active_views > 1) | 1487 if (pending_views_ || num_active_views > 1 || run_renderer_in_process()) |
joth
2012/11/29 23:00:24
I did consider doing this check in render process
| |
1491 return; | 1488 return; |
1492 | 1489 |
1493 // Notify any contents that might have swapped out renderers from this | 1490 // Notify any contents that might have swapped out renderers from this |
1494 // process. They should not attempt to swap them back in. | 1491 // process. They should not attempt to swap them back in. |
1495 NotificationService::current()->Notify( | 1492 NotificationService::current()->Notify( |
1496 NOTIFICATION_RENDERER_PROCESS_CLOSING, | 1493 NOTIFICATION_RENDERER_PROCESS_CLOSING, |
1497 Source<RenderProcessHost>(this), | 1494 Source<RenderProcessHost>(this), |
1498 NotificationService::NoDetails()); | 1495 NotificationService::NoDetails()); |
1499 | 1496 |
1500 Send(new ChildProcessMsg_Shutdown()); | 1497 Send(new ChildProcessMsg_Shutdown()); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1582 int32 gpu_process_host_id) { | 1579 int32 gpu_process_host_id) { |
1583 TRACE_EVENT0("renderer_host", | 1580 TRACE_EVENT0("renderer_host", |
1584 "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwappedNoHost"); | 1581 "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwappedNoHost"); |
1585 RenderWidgetHostImpl::AcknowledgeBufferPresent(route_id, | 1582 RenderWidgetHostImpl::AcknowledgeBufferPresent(route_id, |
1586 gpu_process_host_id, | 1583 gpu_process_host_id, |
1587 false, | 1584 false, |
1588 0); | 1585 0); |
1589 } | 1586 } |
1590 | 1587 |
1591 } // namespace content | 1588 } // namespace content |
OLD | NEW |