| 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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 StoragePartitionImpl* storage_partition_impl, | 387 StoragePartitionImpl* storage_partition_impl, |
| 388 bool is_guest) | 388 bool is_guest) |
| 389 : fast_shutdown_started_(false), | 389 : fast_shutdown_started_(false), |
| 390 deleting_soon_(false), | 390 deleting_soon_(false), |
| 391 #ifndef NDEBUG | 391 #ifndef NDEBUG |
| 392 is_self_deleted_(false), | 392 is_self_deleted_(false), |
| 393 #endif | 393 #endif |
| 394 pending_views_(0), | 394 pending_views_(0), |
| 395 visible_widgets_(0), | 395 visible_widgets_(0), |
| 396 backgrounded_(true), | 396 backgrounded_(true), |
| 397 cached_dibs_cleaner_(FROM_HERE, | |
| 398 base::TimeDelta::FromSeconds(5), | |
| 399 this, | |
| 400 &RenderProcessHostImpl::ClearTransportDIBCache), | |
| 401 is_initialized_(false), | 397 is_initialized_(false), |
| 402 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), | 398 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), |
| 403 browser_context_(browser_context), | 399 browser_context_(browser_context), |
| 404 storage_partition_impl_(storage_partition_impl), | 400 storage_partition_impl_(storage_partition_impl), |
| 405 sudden_termination_allowed_(true), | 401 sudden_termination_allowed_(true), |
| 406 ignore_input_events_(false), | 402 ignore_input_events_(false), |
| 407 is_guest_(is_guest), | 403 is_guest_(is_guest), |
| 408 gpu_observer_registered_(false), | 404 gpu_observer_registered_(false), |
| 409 delayed_cleanup_needed_(false), | 405 delayed_cleanup_needed_(false), |
| 410 within_process_died_observer_(false), | 406 within_process_died_observer_(false), |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 gpu_observer_registered_ = false; | 480 gpu_observer_registered_ = false; |
| 485 } | 481 } |
| 486 | 482 |
| 487 // We may have some unsent messages at this point, but that's OK. | 483 // We may have some unsent messages at this point, but that's OK. |
| 488 channel_.reset(); | 484 channel_.reset(); |
| 489 while (!queued_messages_.empty()) { | 485 while (!queued_messages_.empty()) { |
| 490 delete queued_messages_.front(); | 486 delete queued_messages_.front(); |
| 491 queued_messages_.pop(); | 487 queued_messages_.pop(); |
| 492 } | 488 } |
| 493 | 489 |
| 494 ClearTransportDIBCache(); | |
| 495 UnregisterHost(GetID()); | 490 UnregisterHost(GetID()); |
| 496 | 491 |
| 497 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 492 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| 498 switches::kDisableGpuShaderDiskCache)) { | 493 switches::kDisableGpuShaderDiskCache)) { |
| 499 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 494 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 500 base::Bind(&RemoveShaderInfo, GetID())); | 495 base::Bind(&RemoveShaderInfo, GetID())); |
| 501 } | 496 } |
| 502 } | 497 } |
| 503 | 498 |
| 504 void RenderProcessHostImpl::EnableSendQueue() { | 499 void RenderProcessHostImpl::EnableSendQueue() { |
| (...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1255 } | 1250 } |
| 1256 | 1251 |
| 1257 void RenderProcessHostImpl::DumpHandles() { | 1252 void RenderProcessHostImpl::DumpHandles() { |
| 1258 #if defined(OS_WIN) | 1253 #if defined(OS_WIN) |
| 1259 Send(new ChildProcessMsg_DumpHandles()); | 1254 Send(new ChildProcessMsg_DumpHandles()); |
| 1260 #else | 1255 #else |
| 1261 NOTIMPLEMENTED(); | 1256 NOTIMPLEMENTED(); |
| 1262 #endif | 1257 #endif |
| 1263 } | 1258 } |
| 1264 | 1259 |
| 1265 // This is a platform specific function for mapping a transport DIB given its id | |
| 1266 TransportDIB* RenderProcessHostImpl::MapTransportDIB( | |
| 1267 TransportDIB::Id dib_id) { | |
| 1268 #if defined(OS_WIN) | |
| 1269 // On Windows we need to duplicate the handle from the remote process | |
| 1270 HANDLE section; | |
| 1271 DuplicateHandle(GetHandle(), dib_id.handle, GetCurrentProcess(), §ion, | |
| 1272 FILE_MAP_READ | FILE_MAP_WRITE, | |
| 1273 FALSE, 0); | |
| 1274 return TransportDIB::Map(section); | |
| 1275 #elif defined(OS_ANDROID) | |
| 1276 return TransportDIB::Map(dib_id); | |
| 1277 #else | |
| 1278 // On POSIX, the browser allocates all DIBs and keeps a file descriptor around | |
| 1279 // for each. | |
| 1280 return widget_helper_->MapTransportDIB(dib_id); | |
| 1281 #endif | |
| 1282 } | |
| 1283 | |
| 1284 TransportDIB* RenderProcessHostImpl::GetTransportDIB( | |
| 1285 TransportDIB::Id dib_id) { | |
| 1286 if (!TransportDIB::is_valid_id(dib_id)) | |
| 1287 return NULL; | |
| 1288 | |
| 1289 const std::map<TransportDIB::Id, TransportDIB*>::iterator | |
| 1290 i = cached_dibs_.find(dib_id); | |
| 1291 if (i != cached_dibs_.end()) { | |
| 1292 cached_dibs_cleaner_.Reset(); | |
| 1293 return i->second; | |
| 1294 } | |
| 1295 | |
| 1296 TransportDIB* dib = MapTransportDIB(dib_id); | |
| 1297 if (!dib) | |
| 1298 return NULL; | |
| 1299 | |
| 1300 if (cached_dibs_.size() >= MAX_MAPPED_TRANSPORT_DIBS) { | |
| 1301 // Clean a single entry from the cache | |
| 1302 std::map<TransportDIB::Id, TransportDIB*>::iterator smallest_iterator; | |
| 1303 size_t smallest_size = std::numeric_limits<size_t>::max(); | |
| 1304 | |
| 1305 for (std::map<TransportDIB::Id, TransportDIB*>::iterator | |
| 1306 i = cached_dibs_.begin(); i != cached_dibs_.end(); ++i) { | |
| 1307 if (i->second->size() <= smallest_size) { | |
| 1308 smallest_iterator = i; | |
| 1309 smallest_size = i->second->size(); | |
| 1310 } | |
| 1311 } | |
| 1312 | |
| 1313 delete smallest_iterator->second; | |
| 1314 cached_dibs_.erase(smallest_iterator); | |
| 1315 } | |
| 1316 | |
| 1317 cached_dibs_[dib_id] = dib; | |
| 1318 cached_dibs_cleaner_.Reset(); | |
| 1319 return dib; | |
| 1320 } | |
| 1321 | |
| 1322 void RenderProcessHostImpl::ClearTransportDIBCache() { | |
| 1323 STLDeleteContainerPairSecondPointers( | |
| 1324 cached_dibs_.begin(), cached_dibs_.end()); | |
| 1325 cached_dibs_.clear(); | |
| 1326 } | |
| 1327 | |
| 1328 bool RenderProcessHostImpl::Send(IPC::Message* msg) { | 1260 bool RenderProcessHostImpl::Send(IPC::Message* msg) { |
| 1329 TRACE_EVENT0("renderer_host", "RenderProcessHostImpl::Send"); | 1261 TRACE_EVENT0("renderer_host", "RenderProcessHostImpl::Send"); |
| 1330 if (!channel_) { | 1262 if (!channel_) { |
| 1331 if (!is_initialized_) { | 1263 if (!is_initialized_) { |
| 1332 queued_messages_.push(msg); | 1264 queued_messages_.push(msg); |
| 1333 return true; | 1265 return true; |
| 1334 } else { | 1266 } else { |
| 1335 delete msg; | 1267 delete msg; |
| 1336 return false; | 1268 return false; |
| 1337 } | 1269 } |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1888 | 1820 |
| 1889 IDMap<IPC::Listener>::iterator iter(&listeners_); | 1821 IDMap<IPC::Listener>::iterator iter(&listeners_); |
| 1890 while (!iter.IsAtEnd()) { | 1822 while (!iter.IsAtEnd()) { |
| 1891 iter.GetCurrentValue()->OnMessageReceived( | 1823 iter.GetCurrentValue()->OnMessageReceived( |
| 1892 ViewHostMsg_RenderProcessGone(iter.GetCurrentKey(), | 1824 ViewHostMsg_RenderProcessGone(iter.GetCurrentKey(), |
| 1893 static_cast<int>(status), | 1825 static_cast<int>(status), |
| 1894 exit_code)); | 1826 exit_code)); |
| 1895 iter.Advance(); | 1827 iter.Advance(); |
| 1896 } | 1828 } |
| 1897 | 1829 |
| 1898 ClearTransportDIBCache(); | |
| 1899 | |
| 1900 render_process_host_mojo_.reset(); | 1830 render_process_host_mojo_.reset(); |
| 1901 | 1831 |
| 1902 // It's possible that one of the calls out to the observers might have caused | 1832 // It's possible that one of the calls out to the observers might have caused |
| 1903 // this object to be no longer needed. | 1833 // this object to be no longer needed. |
| 1904 if (delayed_cleanup_needed_) | 1834 if (delayed_cleanup_needed_) |
| 1905 Cleanup(); | 1835 Cleanup(); |
| 1906 | 1836 |
| 1907 // This object is not deleted at this point and might be reused later. | 1837 // This object is not deleted at this point and might be reused later. |
| 1908 // TODO(darin): clean this up | 1838 // TODO(darin): clean this up |
| 1909 } | 1839 } |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2119 | 2049 |
| 2120 void RenderProcessHostImpl::SetWebUIHandle( | 2050 void RenderProcessHostImpl::SetWebUIHandle( |
| 2121 int32 view_routing_id, | 2051 int32 view_routing_id, |
| 2122 mojo::ScopedMessagePipeHandle handle) { | 2052 mojo::ScopedMessagePipeHandle handle) { |
| 2123 if (!render_process_host_mojo_) | 2053 if (!render_process_host_mojo_) |
| 2124 render_process_host_mojo_.reset(new RenderProcessHostMojoImpl(this)); | 2054 render_process_host_mojo_.reset(new RenderProcessHostMojoImpl(this)); |
| 2125 render_process_host_mojo_->SetWebUIHandle(view_routing_id, handle.Pass()); | 2055 render_process_host_mojo_->SetWebUIHandle(view_routing_id, handle.Pass()); |
| 2126 } | 2056 } |
| 2127 | 2057 |
| 2128 } // namespace content | 2058 } // namespace content |
| OLD | NEW |