| Index: content/renderer/gpu/gpu_channel_host.cc
|
| diff --git a/content/renderer/gpu/gpu_channel_host.cc b/content/renderer/gpu/gpu_channel_host.cc
|
| index 96c652b048a8cfd9d019442ead74794e655cc7c7..05d73d5749ea1fd94a1ca72df155d4cb09fd6a1b 100644
|
| --- a/content/renderer/gpu/gpu_channel_host.cc
|
| +++ b/content/renderer/gpu/gpu_channel_host.cc
|
| @@ -7,14 +7,18 @@
|
| #include "base/bind.h"
|
| #include "base/message_loop.h"
|
| #include "base/message_loop_proxy.h"
|
| -#include "content/common/child_process.h"
|
| +#include "content/common/child_thread.h"
|
| #include "content/common/gpu/gpu_messages.h"
|
| #include "content/renderer/gpu/command_buffer_proxy.h"
|
| -#include "content/renderer/render_process.h"
|
| -#include "content/renderer/render_thread_impl.h"
|
| #include "googleurl/src/gurl.h"
|
| #include "ipc/ipc_sync_message_filter.h"
|
|
|
| +GpuChannelHostFactory* GpuChannelHostFactory::instance_ = NULL;
|
| +
|
| +GpuChannelHostFactory::~GpuChannelHostFactory() {
|
| + DCHECK(!instance_);
|
| +}
|
| +
|
| using base::AutoLock;
|
| using base::MessageLoopProxy;
|
|
|
| @@ -36,7 +40,7 @@ void GpuChannelHost::MessageFilter::AddRoute(
|
| int route_id,
|
| base::WeakPtr<IPC::Channel::Listener> listener,
|
| scoped_refptr<MessageLoopProxy> loop) {
|
| - DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop());
|
| + DCHECK(parent_->factory_->IsIOThread());
|
| DCHECK(listeners_.find(route_id) == listeners_.end());
|
| GpuListenerInfo info;
|
| info.listener = listener;
|
| @@ -45,7 +49,7 @@ void GpuChannelHost::MessageFilter::AddRoute(
|
| }
|
|
|
| void GpuChannelHost::MessageFilter::RemoveRoute(int route_id) {
|
| - DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop());
|
| + DCHECK(parent_->factory_->IsIOThread());
|
| ListenerMap::iterator it = listeners_.find(route_id);
|
| if (it != listeners_.end())
|
| listeners_.erase(it);
|
| @@ -53,7 +57,7 @@ void GpuChannelHost::MessageFilter::RemoveRoute(int route_id) {
|
|
|
| bool GpuChannelHost::MessageFilter::OnMessageReceived(
|
| const IPC::Message& message) {
|
| - DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop());
|
| + DCHECK(parent_->factory_->IsIOThread());
|
| // Never handle sync message replies or we will deadlock here.
|
| if (message.is_reply())
|
| return false;
|
| @@ -76,7 +80,7 @@ bool GpuChannelHost::MessageFilter::OnMessageReceived(
|
| }
|
|
|
| void GpuChannelHost::MessageFilter::OnChannelError() {
|
| - DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop());
|
| + DCHECK(parent_->factory_->IsIOThread());
|
| // Inform all the proxies that an error has occurred. This will be reported
|
| // via OpenGL as a lost context.
|
| for (ListenerMap::iterator it = listeners_.begin();
|
| @@ -90,14 +94,14 @@ void GpuChannelHost::MessageFilter::OnChannelError() {
|
|
|
| listeners_.clear();
|
|
|
| - ChildThread* main_thread = RenderProcess::current()->main_thread();
|
| - MessageLoop* main_loop = main_thread->message_loop();
|
| + MessageLoop* main_loop = parent_->factory_->GetMainLoop();
|
| main_loop->PostTask(FROM_HERE,
|
| base::Bind(&GpuChannelHost::OnChannelError, parent_));
|
| }
|
|
|
| -GpuChannelHost::GpuChannelHost()
|
| - : state_(kUnconnected) {
|
| +GpuChannelHost::GpuChannelHost(GpuChannelHostFactory* factory)
|
| + : factory_(factory),
|
| + state_(kUnconnected) {
|
| }
|
|
|
| GpuChannelHost::~GpuChannelHost() {
|
| @@ -106,16 +110,16 @@ GpuChannelHost::~GpuChannelHost() {
|
| void GpuChannelHost::Connect(
|
| const IPC::ChannelHandle& channel_handle,
|
| base::ProcessHandle renderer_process_for_gpu) {
|
| - DCHECK(RenderThreadImpl::current());
|
| + DCHECK(factory_->IsMainThread());
|
| // Open a channel to the GPU process. We pass NULL as the main listener here
|
| // since we need to filter everything to route it to the right thread.
|
| channel_.reset(new IPC::SyncChannel(
|
| channel_handle, IPC::Channel::MODE_CLIENT, NULL,
|
| - ChildProcess::current()->io_message_loop_proxy(), true,
|
| - ChildProcess::current()->GetShutDownEvent()));
|
| + factory_->GetIOLoopProxy(), true,
|
| + factory_->GetShutDownEvent()));
|
|
|
| sync_filter_ = new IPC::SyncMessageFilter(
|
| - ChildProcess::current()->GetShutDownEvent());
|
| + factory_->GetShutDownEvent());
|
|
|
| channel_->AddFilter(sync_filter_.get());
|
|
|
| @@ -163,12 +167,12 @@ bool GpuChannelHost::Send(IPC::Message* message) {
|
| // Currently we need to choose between two different mechanisms for sending.
|
| // On the main thread we use the regular channel Send() method, on another
|
| // thread we use SyncMessageFilter. We also have to be careful interpreting
|
| - // RenderThreadImpl::current() since it might return NULL during shutdown,
|
| + // IsMainThread() since it might return false during shutdown,
|
| // impl we are actually calling from the main thread (discard message then).
|
| //
|
| // TODO: Can we just always use sync_filter_ since we setup the channel
|
| // without a main listener?
|
| - if (RenderThreadImpl::current()) {
|
| + if (factory_->IsMainThread()) {
|
| if (channel_.get())
|
| return channel_->Send(message);
|
| } else if (MessageLoop::current()) {
|
| @@ -188,7 +192,7 @@ CommandBufferProxy* GpuChannelHost::CreateViewCommandBuffer(
|
| const std::vector<int32>& attribs,
|
| const GURL& active_url,
|
| gfx::GpuPreference gpu_preference) {
|
| - DCHECK(ChildThread::current());
|
| + DCHECK(factory_->IsMainThread());
|
| #if defined(ENABLE_GPU)
|
| AutoLock lock(context_lock_);
|
| // An error occurred. Need to get the host again to reinitialize it.
|
| @@ -202,15 +206,7 @@ CommandBufferProxy* GpuChannelHost::CreateViewCommandBuffer(
|
| init_params.attribs = attribs;
|
| init_params.active_url = active_url;
|
| init_params.gpu_preference = gpu_preference;
|
| - int32 route_id;
|
| - if (!ChildThread::current()->Send(
|
| - new GpuHostMsg_CreateViewCommandBuffer(
|
| - surface_id,
|
| - init_params,
|
| - &route_id))) {
|
| - return NULL;
|
| - }
|
| -
|
| + int32 route_id = factory_->CreateViewCommandBuffer(surface_id, init_params);
|
| if (route_id == MSG_ROUTING_NONE)
|
| return NULL;
|
|
|
| @@ -291,7 +287,7 @@ void GpuChannelHost::AddRoute(
|
| int route_id, base::WeakPtr<IPC::Channel::Listener> listener) {
|
| DCHECK(MessageLoopProxy::current());
|
|
|
| - MessageLoopProxy* io_loop = RenderProcess::current()->io_message_loop_proxy();
|
| + MessageLoopProxy* io_loop = factory_->GetIOLoopProxy();
|
| io_loop->PostTask(FROM_HERE,
|
| base::Bind(&GpuChannelHost::MessageFilter::AddRoute,
|
| channel_filter_.get(), route_id, listener,
|
| @@ -299,7 +295,7 @@ void GpuChannelHost::AddRoute(
|
| }
|
|
|
| void GpuChannelHost::RemoveRoute(int route_id) {
|
| - MessageLoopProxy* io_loop = RenderProcess::current()->io_message_loop_proxy();
|
| + MessageLoopProxy* io_loop = factory_->GetIOLoopProxy();
|
| io_loop->PostTask(FROM_HERE,
|
| base::Bind(&GpuChannelHost::MessageFilter::RemoveRoute,
|
| channel_filter_.get(), route_id));
|
|
|