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 |