| 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 #include "content/common/gpu/client/gpu_channel_host.h" | 5 #include "content/common/gpu/client/gpu_channel_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 ProxyFlushInfo::~ProxyFlushInfo() { | 40 ProxyFlushInfo::~ProxyFlushInfo() { |
| 41 } | 41 } |
| 42 | 42 |
| 43 // static | 43 // static |
| 44 scoped_refptr<GpuChannelHost> GpuChannelHost::Create( | 44 scoped_refptr<GpuChannelHost> GpuChannelHost::Create( |
| 45 GpuChannelHostFactory* factory, | 45 GpuChannelHostFactory* factory, |
| 46 const gpu::GPUInfo& gpu_info, | 46 const gpu::GPUInfo& gpu_info, |
| 47 const IPC::ChannelHandle& channel_handle, | 47 const IPC::ChannelHandle& channel_handle, |
| 48 base::WaitableEvent* shutdown_event, | 48 base::WaitableEvent* shutdown_event, |
| 49 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager) { | 49 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager) { |
| 50 DCHECK(factory->IsMainThread()); | 50 DCHECK(factory->GetMainTaskRunner()->BelongsToCurrentThread()); |
| 51 scoped_refptr<GpuChannelHost> host = | 51 scoped_refptr<GpuChannelHost> host = |
| 52 new GpuChannelHost(factory, gpu_info, gpu_memory_buffer_manager); | 52 new GpuChannelHost(factory, gpu_info, gpu_memory_buffer_manager); |
| 53 host->Connect(channel_handle, shutdown_event); | 53 host->Connect(channel_handle, shutdown_event); |
| 54 return host; | 54 return host; |
| 55 } | 55 } |
| 56 | 56 |
| 57 GpuChannelHost::GpuChannelHost( | 57 GpuChannelHost::GpuChannelHost( |
| 58 GpuChannelHostFactory* factory, | 58 GpuChannelHostFactory* factory, |
| 59 const gpu::GPUInfo& gpu_info, | 59 const gpu::GPUInfo& gpu_info, |
| 60 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager) | 60 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 message->set_unblock(false); | 98 message->set_unblock(false); |
| 99 | 99 |
| 100 // Currently we need to choose between two different mechanisms for sending. | 100 // Currently we need to choose between two different mechanisms for sending. |
| 101 // On the main thread we use the regular channel Send() method, on another | 101 // On the main thread we use the regular channel Send() method, on another |
| 102 // thread we use SyncMessageFilter. We also have to be careful interpreting | 102 // thread we use SyncMessageFilter. We also have to be careful interpreting |
| 103 // IsMainThread() since it might return false during shutdown, | 103 // IsMainThread() since it might return false during shutdown, |
| 104 // impl we are actually calling from the main thread (discard message then). | 104 // impl we are actually calling from the main thread (discard message then). |
| 105 // | 105 // |
| 106 // TODO: Can we just always use sync_filter_ since we setup the channel | 106 // TODO: Can we just always use sync_filter_ since we setup the channel |
| 107 // without a main listener? | 107 // without a main listener? |
| 108 if (factory_->IsMainThread()) { | 108 if (factory_->GetMainTaskRunner()->BelongsToCurrentThread()) { |
| 109 // http://crbug.com/125264 | 109 // http://crbug.com/125264 |
| 110 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 110 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 111 bool result = channel_->Send(message.release()); | 111 bool result = channel_->Send(message.release()); |
| 112 if (!result) | 112 if (!result) |
| 113 DVLOG(1) << "GpuChannelHost::Send failed: Channel::Send failed"; | 113 DVLOG(1) << "GpuChannelHost::Send failed: Channel::Send failed"; |
| 114 return result; | 114 return result; |
| 115 } | 115 } |
| 116 | 116 |
| 117 bool result = sync_filter_->Send(message.release()); | 117 bool result = sync_filter_->Send(message.release()); |
| 118 return result; | 118 return result; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 AutoLock lock(context_lock_); | 267 AutoLock lock(context_lock_); |
| 268 proxies_.erase(route_id); | 268 proxies_.erase(route_id); |
| 269 if (flush_info_.flush_pending && flush_info_.route_id == route_id) | 269 if (flush_info_.flush_pending && flush_info_.route_id == route_id) |
| 270 flush_info_.flush_pending = false; | 270 flush_info_.flush_pending = false; |
| 271 | 271 |
| 272 delete command_buffer; | 272 delete command_buffer; |
| 273 } | 273 } |
| 274 | 274 |
| 275 void GpuChannelHost::DestroyChannel() { | 275 void GpuChannelHost::DestroyChannel() { |
| 276 // channel_ must be destroyed on the main thread. | 276 // channel_ must be destroyed on the main thread. |
| 277 if (channel_.get() && !factory_->IsMainThread()) | 277 if (channel_.get()) { |
| 278 factory_->GetMainLoop()->DeleteSoon(FROM_HERE, channel_.release()); | 278 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner = |
| 279 factory_->GetMainTaskRunner(); |
| 280 if (!main_task_runner->RunsTasksOnCurrentThread()) |
| 281 main_task_runner->DeleteSoon(FROM_HERE, channel_.release()); |
| 282 } |
| 279 channel_.reset(); | 283 channel_.reset(); |
| 280 } | 284 } |
| 281 | 285 |
| 282 void GpuChannelHost::AddRoute( | 286 void GpuChannelHost::AddRoute( |
| 283 int route_id, base::WeakPtr<IPC::Listener> listener) { | 287 int route_id, base::WeakPtr<IPC::Listener> listener) { |
| 284 DCHECK(MessageLoopProxy::current().get()); | 288 DCHECK(MessageLoopProxy::current().get()); |
| 285 | 289 |
| 286 scoped_refptr<base::MessageLoopProxy> io_loop = factory_->GetIOLoopProxy(); | 290 scoped_refptr<base::MessageLoopProxy> io_loop = factory_->GetIOLoopProxy(); |
| 287 io_loop->PostTask(FROM_HERE, | 291 io_loop->PostTask(FROM_HERE, |
| 288 base::Bind(&GpuChannelHost::MessageFilter::AddRoute, | 292 base::Bind(&GpuChannelHost::MessageFilter::AddRoute, |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 | 430 |
| 427 listeners_.clear(); | 431 listeners_.clear(); |
| 428 } | 432 } |
| 429 | 433 |
| 430 bool GpuChannelHost::MessageFilter::IsLost() const { | 434 bool GpuChannelHost::MessageFilter::IsLost() const { |
| 431 AutoLock lock(lock_); | 435 AutoLock lock(lock_); |
| 432 return lost_; | 436 return lost_; |
| 433 } | 437 } |
| 434 | 438 |
| 435 } // namespace content | 439 } // namespace content |
| OLD | NEW |