Index: content/browser/renderer_host/gpu_message_filter.cc |
diff --git a/content/browser/renderer_host/gpu_message_filter.cc b/content/browser/renderer_host/gpu_message_filter.cc |
index 40e8803189c3b685c6e5ba7fc3e8ad79172b429b..0533829c651cd278cb6d67c1e27d0b8737676748 100644 |
--- a/content/browser/renderer_host/gpu_message_filter.cc |
+++ b/content/browser/renderer_host/gpu_message_filter.cc |
@@ -8,7 +8,7 @@ |
#include "content/browser/renderer_host/gpu_message_filter.h" |
-#include "base/callback.h" |
+#include "base/bind.h" |
#include "content/browser/gpu/gpu_process_host.h" |
#include "content/browser/renderer_host/render_widget_helper.h" |
#include "content/common/gpu/gpu_messages.h" |
@@ -41,98 +41,11 @@ bool GpuMessageFilter::OnMessageReceived( |
return handled; |
} |
-// Callbacks used in this file. |
-namespace { |
- |
-class EstablishChannelCallback |
- : public CallbackRunner<Tuple3<const IPC::ChannelHandle&, |
- base::ProcessHandle, |
- const content::GPUInfo&> > { |
- public: |
- EstablishChannelCallback(GpuMessageFilter* filter, IPC::Message* reply) |
- : filter_(filter->AsWeakPtr()), |
- reply_(reply) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- } |
- |
- virtual void RunWithParams(const TupleType& params) { |
- DispatchToMethod(this, &EstablishChannelCallback::Send, params); |
- } |
- |
- void Send(const IPC::ChannelHandle& channel, |
- base::ProcessHandle gpu_process_for_browser, |
- const content::GPUInfo& gpu_info) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- if (!filter_) |
- return; |
- |
- base::ProcessHandle renderer_process_for_gpu; |
- if (gpu_process_for_browser != 0) { |
-#if defined(OS_WIN) |
- // Create a process handle that the renderer process can give to the GPU |
- // process to give it access to its handles. |
- DuplicateHandle(base::GetCurrentProcessHandle(), |
- filter_->peer_handle(), |
- gpu_process_for_browser, |
- &renderer_process_for_gpu, |
- PROCESS_DUP_HANDLE, |
- FALSE, |
- 0); |
-#else |
- renderer_process_for_gpu = filter_->peer_handle(); |
-#endif |
- } else { |
- renderer_process_for_gpu = 0; |
- } |
- |
- GpuHostMsg_EstablishGpuChannel::WriteReplyParams(reply_, |
- channel, |
- renderer_process_for_gpu, |
- gpu_info); |
- filter_->Send(reply_); |
- } |
- |
- private: |
- base::WeakPtr<GpuMessageFilter> filter_; |
- IPC::Message* reply_; |
-}; |
- |
-class CreateCommandBufferCallback : public CallbackRunner<Tuple1<int32> > { |
- public: |
- CreateCommandBufferCallback(GpuMessageFilter* filter, |
- IPC::Message* reply) : |
- filter_(filter->AsWeakPtr()), |
- reply_(reply) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- } |
- |
- virtual void RunWithParams(const TupleType& params) { |
- DispatchToMethod(this, &CreateCommandBufferCallback::Send, params); |
- } |
- |
- void Send(int32 route_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- GpuHostMsg_CreateViewCommandBuffer::WriteReplyParams(reply_, route_id); |
- if (filter_) |
- filter_->Send(reply_); |
- } |
- |
- private: |
- base::WeakPtr<GpuMessageFilter> filter_; |
- IPC::Message* reply_; |
-}; |
- |
-} // namespace |
- |
void GpuMessageFilter::OnEstablishGpuChannel( |
content::CauseForGpuLaunch cause_for_gpu_launch, |
IPC::Message* reply) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- scoped_ptr<EstablishChannelCallback> callback( |
- new EstablishChannelCallback(this, reply)); |
- |
// TODO(apatrick): Eventually, this will return the route ID of a |
// GpuProcessStub, from which the renderer process will create a |
// GpuProcessProxy. The renderer will use the proxy for all subsequent |
@@ -153,7 +66,11 @@ void GpuMessageFilter::OnEstablishGpuChannel( |
gpu_host_id_ = host->host_id(); |
} |
- host->EstablishGpuChannel(render_process_id_, callback.release()); |
+ host->EstablishGpuChannel( |
+ render_process_id_, |
+ base::Bind(&GpuMessageFilter::EstablishChannelCallback, |
+ AsWeakPtr(), |
+ reply)); |
} |
void GpuMessageFilter::OnCreateViewCommandBuffer( |
@@ -181,5 +98,46 @@ void GpuMessageFilter::OnCreateViewCommandBuffer( |
render_view_id, |
render_process_id_, |
init_params, |
- new CreateCommandBufferCallback(this, reply)); |
+ base::Bind(&GpuMessageFilter::CreateCommandBufferCallback, |
+ AsWeakPtr(), |
+ reply)); |
+} |
+ |
+void GpuMessageFilter::EstablishChannelCallback( |
+ IPC::Message* reply, |
+ const IPC::ChannelHandle& channel, |
+ base::ProcessHandle gpu_process_for_browser, |
+ const content::GPUInfo& gpu_info) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ base::ProcessHandle renderer_process_for_gpu; |
+ if (gpu_process_for_browser != 0) { |
+#if defined(OS_WIN) |
+ // Create a process handle that the renderer process can give to the GPU |
+ // process to give it access to its handles. |
+ DuplicateHandle(base::GetCurrentProcessHandle(), |
+ peer_handle(), |
+ gpu_process_for_browser, |
+ &renderer_process_for_gpu, |
+ PROCESS_DUP_HANDLE, |
+ FALSE, |
+ 0); |
+#else |
+ renderer_process_for_gpu = peer_handle(); |
+#endif |
+ } else { |
+ renderer_process_for_gpu = 0; |
+ } |
+ |
+ GpuHostMsg_EstablishGpuChannel::WriteReplyParams( |
+ reply, channel, renderer_process_for_gpu, gpu_info); |
+ Send(reply); |
} |
+ |
+void GpuMessageFilter::CreateCommandBufferCallback( |
+ IPC::Message* reply, int32 route_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ GpuHostMsg_CreateViewCommandBuffer::WriteReplyParams(reply, route_id); |
+ Send(reply); |
+} |
+ |