| 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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 | 137 |
| 138 #include "third_party/skia/include/core/SkBitmap.h" | 138 #include "third_party/skia/include/core/SkBitmap.h" |
| 139 | 139 |
| 140 extern bool g_exited_main_message_loop; | 140 extern bool g_exited_main_message_loop; |
| 141 | 141 |
| 142 static const char* kSiteProcessMapKeyName = "content_site_process_map"; | 142 static const char* kSiteProcessMapKeyName = "content_site_process_map"; |
| 143 | 143 |
| 144 namespace content { | 144 namespace content { |
| 145 namespace { | 145 namespace { |
| 146 | 146 |
| 147 base::MessageLoop* g_in_process_thread; |
| 148 |
| 147 void CacheShaderInfo(int32 id, base::FilePath path) { | 149 void CacheShaderInfo(int32 id, base::FilePath path) { |
| 148 ShaderCacheFactory::GetInstance()->SetCacheInfo(id, path); | 150 ShaderCacheFactory::GetInstance()->SetCacheInfo(id, path); |
| 149 } | 151 } |
| 150 | 152 |
| 151 void RemoveShaderInfo(int32 id) { | 153 void RemoveShaderInfo(int32 id) { |
| 152 ShaderCacheFactory::GetInstance()->RemoveCacheInfo(id); | 154 ShaderCacheFactory::GetInstance()->RemoveCacheInfo(id); |
| 153 } | 155 } |
| 154 | 156 |
| 155 } // namespace | 157 } // namespace |
| 156 | 158 |
| 157 // This class creates the IO thread for the renderer when running in | 159 // This class creates the IO thread for the renderer when running in |
| 158 // single-process mode. It's not used in multi-process mode. | 160 // single-process mode. It's not used in multi-process mode. |
| 159 class RendererMainThread : public base::Thread { | 161 class RendererMainThread : public base::Thread { |
| 160 public: | 162 public: |
| 161 explicit RendererMainThread(const std::string& channel_id) | 163 explicit RendererMainThread(const std::string& channel_id) |
| 162 : Thread("Chrome_InProcRendererThread"), | 164 : Thread("Chrome_InProcRendererThread"), |
| 163 channel_id_(channel_id) { | 165 channel_id_(channel_id) { |
| 164 } | 166 } |
| 165 | 167 |
| 166 virtual ~RendererMainThread() { | 168 virtual ~RendererMainThread() { |
| 167 Stop(); | 169 Stop(); |
| 168 } | 170 } |
| 169 | 171 |
| 170 protected: | 172 protected: |
| 171 virtual void Init() OVERRIDE { | 173 virtual void Init() OVERRIDE { |
| 172 render_process_.reset(new RenderProcessImpl()); | 174 render_process_.reset(new RenderProcessImpl()); |
| 173 new RenderThreadImpl(channel_id_); | 175 new RenderThreadImpl(channel_id_); |
| 176 g_in_process_thread = message_loop(); |
| 174 } | 177 } |
| 175 | 178 |
| 176 virtual void CleanUp() OVERRIDE { | 179 virtual void CleanUp() OVERRIDE { |
| 180 g_in_process_thread = NULL; |
| 177 render_process_.reset(); | 181 render_process_.reset(); |
| 178 | 182 |
| 179 // It's a little lame to manually set this flag. But the single process | 183 // It's a little lame to manually set this flag. But the single process |
| 180 // RendererThread will receive the WM_QUIT. We don't need to assert on | 184 // RendererThread will receive the WM_QUIT. We don't need to assert on |
| 181 // this thread, so just force the flag manually. | 185 // this thread, so just force the flag manually. |
| 182 // If we want to avoid this, we could create the InProcRendererThread | 186 // If we want to avoid this, we could create the InProcRendererThread |
| 183 // directly with _beginthreadex() rather than using the Thread class. | 187 // directly with _beginthreadex() rather than using the Thread class. |
| 184 // We used to set this flag in the Init function above. However there | 188 // We used to set this flag in the Init function above. However there |
| 185 // other threads like WebThread which are created by this thread | 189 // other threads like WebThread which are created by this thread |
| 186 // which resets this flag. Please see Thread::StartWithOptions. Setting | 190 // which resets this flag. Please see Thread::StartWithOptions. Setting |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 if (run_renderer_in_process()) { | 494 if (run_renderer_in_process()) { |
| 491 // Crank up a thread and run the initialization there. With the way that | 495 // Crank up a thread and run the initialization there. With the way that |
| 492 // messages flow between the browser and renderer, this thread is required | 496 // messages flow between the browser and renderer, this thread is required |
| 493 // to prevent a deadlock in single-process mode. Since the primordial | 497 // to prevent a deadlock in single-process mode. Since the primordial |
| 494 // thread in the renderer process runs the WebKit code and can sometimes | 498 // thread in the renderer process runs the WebKit code and can sometimes |
| 495 // make blocking calls to the UI thread (i.e. this thread), they need to run | 499 // make blocking calls to the UI thread (i.e. this thread), they need to run |
| 496 // on separate threads. | 500 // on separate threads. |
| 497 in_process_renderer_.reset(new RendererMainThread(channel_id)); | 501 in_process_renderer_.reset(new RendererMainThread(channel_id)); |
| 498 | 502 |
| 499 base::Thread::Options options; | 503 base::Thread::Options options; |
| 500 #if !defined(TOOLKIT_GTK) && !defined(OS_ANDROID) | 504 #if defined(OS_WIN) && !defined(OS_MACOSX) |
| 501 // In-process plugins require this to be a UI message loop. | 505 // In-process plugins require this to be a UI message loop. |
| 502 options.message_loop_type = MessageLoop::TYPE_UI; | 506 options.message_loop_type = MessageLoop::TYPE_UI; |
| 503 #else | 507 #else |
| 504 // We can't have multiple UI loops on GTK and Android, so we don't support | 508 // We can't have multiple UI loops on Linux and Android, so we don't support |
| 505 // in-process plugins. | 509 // in-process plugins. |
| 506 options.message_loop_type = MessageLoop::TYPE_DEFAULT; | 510 options.message_loop_type = MessageLoop::TYPE_DEFAULT; |
| 507 #endif | 511 #endif |
| 508 in_process_renderer_->StartWithOptions(options); | 512 in_process_renderer_->StartWithOptions(options); |
| 509 | 513 |
| 510 OnProcessLaunched(); // Fake a callback that the process is ready. | 514 OnProcessLaunched(); // Fake a callback that the process is ready. |
| 511 } else { | 515 } else { |
| 512 // Build command line for renderer. We call AppendRendererCommandLine() | 516 // Build command line for renderer. We call AppendRendererCommandLine() |
| 513 // first so the process type argument will appear first. | 517 // first so the process type argument will appear first. |
| 514 CommandLine* cmd_line = new CommandLine(renderer_path); | 518 CommandLine* cmd_line = new CommandLine(renderer_path); |
| (...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1532 | 1536 |
| 1533 // Only register valid, non-empty sites. Empty or invalid sites will not | 1537 // Only register valid, non-empty sites. Empty or invalid sites will not |
| 1534 // use process-per-site mode. We cannot check whether the process has | 1538 // use process-per-site mode. We cannot check whether the process has |
| 1535 // appropriate bindings here, because the bindings have not yet been granted. | 1539 // appropriate bindings here, because the bindings have not yet been granted. |
| 1536 std::string site = SiteInstance::GetSiteForURL(browser_context, url) | 1540 std::string site = SiteInstance::GetSiteForURL(browser_context, url) |
| 1537 .possibly_invalid_spec(); | 1541 .possibly_invalid_spec(); |
| 1538 if (!site.empty()) | 1542 if (!site.empty()) |
| 1539 map->RegisterProcess(site, process); | 1543 map->RegisterProcess(site, process); |
| 1540 } | 1544 } |
| 1541 | 1545 |
| 1546 base::MessageLoop* |
| 1547 RenderProcessHostImpl::GetInProcessRendererThreadForTesting() { |
| 1548 return g_in_process_thread; |
| 1549 } |
| 1550 |
| 1542 void RenderProcessHostImpl::ProcessDied(bool already_dead) { | 1551 void RenderProcessHostImpl::ProcessDied(bool already_dead) { |
| 1543 // Our child process has died. If we didn't expect it, it's a crash. | 1552 // Our child process has died. If we didn't expect it, it's a crash. |
| 1544 // In any case, we need to let everyone know it's gone. | 1553 // In any case, we need to let everyone know it's gone. |
| 1545 // The OnChannelError notification can fire multiple times due to nested sync | 1554 // The OnChannelError notification can fire multiple times due to nested sync |
| 1546 // calls to a renderer. If we don't have a valid channel here it means we | 1555 // calls to a renderer. If we don't have a valid channel here it means we |
| 1547 // already handled the error. | 1556 // already handled the error. |
| 1548 | 1557 |
| 1549 // child_process_launcher_ can be NULL in single process mode or if fast | 1558 // child_process_launcher_ can be NULL in single process mode or if fast |
| 1550 // termination happened. | 1559 // termination happened. |
| 1551 int exit_code = 0; | 1560 int exit_code = 0; |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1728 TRACE_EVENT0("renderer_host", | 1737 TRACE_EVENT0("renderer_host", |
| 1729 "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwappedNoHost"); | 1738 "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwappedNoHost"); |
| 1730 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; | 1739 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| 1731 ack_params.sync_point = 0; | 1740 ack_params.sync_point = 0; |
| 1732 RenderWidgetHostImpl::AcknowledgeBufferPresent(route_id, | 1741 RenderWidgetHostImpl::AcknowledgeBufferPresent(route_id, |
| 1733 gpu_process_host_id, | 1742 gpu_process_host_id, |
| 1734 ack_params); | 1743 ack_params); |
| 1735 } | 1744 } |
| 1736 | 1745 |
| 1737 } // namespace content | 1746 } // namespace content |
| OLD | NEW |