Index: chrome/renderer/render_process.cc |
=================================================================== |
--- chrome/renderer/render_process.cc (revision 21215) |
+++ chrome/renderer/render_process.cc (working copy) |
@@ -47,10 +47,43 @@ |
//----------------------------------------------------------------------------- |
RenderProcess::RenderProcess() |
- : ALLOW_THIS_IN_INITIALIZER_LIST(shared_mem_cache_cleaner_( |
+ : ChildProcess(new RenderThread()), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(shared_mem_cache_cleaner_( |
base::TimeDelta::FromSeconds(5), |
this, &RenderProcess::ClearTransportDIBCache)), |
sequence_number_(0) { |
+ Init(); |
+} |
+ |
+RenderProcess::RenderProcess(const std::string& channel_name) |
+ : ChildProcess(new RenderThread(channel_name)), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(shared_mem_cache_cleaner_( |
+ base::TimeDelta::FromSeconds(5), |
+ this, &RenderProcess::ClearTransportDIBCache)), |
+ sequence_number_(0) { |
+ Init(); |
+} |
+ |
+RenderProcess::~RenderProcess() { |
+ // TODO(port) |
+ // Try and limit what we pull in for our non-Win unit test bundle |
+#ifndef NDEBUG |
+ // log important leaked objects |
+ webkit_glue::CheckForLeaks(); |
+#endif |
+ |
+ GetShutDownEvent()->Signal(); |
+ |
+ // We need to stop the RenderThread as the clearer_factory_ |
+ // member could be in use while the object itself is destroyed, |
+ // as a result of the containing RenderProcess object being destroyed. |
+ // This race condition causes a crash when the renderer process is shutting |
+ // down. |
+ child_thread()->Stop(); |
+ ClearTransportDIBCache(); |
+} |
+ |
+void RenderProcess::Init() { |
in_process_plugins_ = InProcessPlugins(); |
for (size_t i = 0; i < arraysize(shared_mem_cache_); ++i) |
shared_mem_cache_[i] = NULL; |
@@ -98,18 +131,6 @@ |
media::InitializeMediaLibrary(module_path); |
} |
-RenderProcess::~RenderProcess() { |
- // TODO(port) |
- // Try and limit what we pull in for our non-Win unit test bundle |
-#ifndef NDEBUG |
- // log important leaked objects |
- webkit_glue::CheckForLeaks(); |
-#endif |
- |
- GetShutDownEvent()->Signal(); |
- ClearTransportDIBCache(); |
-} |
- |
bool RenderProcess::InProcessPlugins() { |
const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
#if defined(OS_LINUX) |
@@ -136,7 +157,7 @@ |
// get one. |
TransportDIB::Handle handle; |
IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(size, &handle); |
- if (!main_thread()->Send(msg)) |
+ if (!child_thread()->Send(msg)) |
return NULL; |
if (handle.fd < 0) |
return NULL; |
@@ -152,7 +173,7 @@ |
// On Mac we need to tell the browser that it can drop a reference to the |
// shared memory. |
IPC::Message* msg = new ViewHostMsg_FreeTransportDIB(dib->id()); |
- main_thread()->Send(msg); |
+ child_thread()->Send(msg); |
#endif |
delete dib; |