Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2004)

Unified Diff: content/common/gpu/gpu_channel.cc

Issue 299003004: Fix leak in GpuChannel (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/gpu/gpu_channel.h ('k') | content/common/gpu/gpu_channel_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/gpu_channel.cc
diff --git a/content/common/gpu/gpu_channel.cc b/content/common/gpu/gpu_channel.cc
index 75a18e92c9cb8a2c727cac16f1a332596a7d3e7a..1c8e4f95f3cb853e72a7ab1829288f19ed86b002 100644
--- a/content/common/gpu/gpu_channel.cc
+++ b/content/common/gpu/gpu_channel.cc
@@ -15,6 +15,7 @@
#include "base/command_line.h"
#include "base/debug/trace_event.h"
#include "base/message_loop/message_loop_proxy.h"
+#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/timer/timer.h"
#include "content/common/gpu/devtools_gpu_agent.h"
@@ -71,8 +72,7 @@ const int64 kStopPreemptThresholdMs = kVsyncIntervalMs;
// - it generates mailbox names for clients of the GPU process on the IO thread.
class GpuChannelMessageFilter : public IPC::MessageFilter {
public:
- // Takes ownership of gpu_channel (see below).
- GpuChannelMessageFilter(base::WeakPtr<GpuChannel>* gpu_channel,
+ GpuChannelMessageFilter(base::WeakPtr<GpuChannel> gpu_channel,
scoped_refptr<SyncPointManager> sync_point_manager,
scoped_refptr<base::MessageLoopProxy> message_loop)
: preemption_state_(IDLE),
@@ -81,8 +81,7 @@ class GpuChannelMessageFilter : public IPC::MessageFilter {
sync_point_manager_(sync_point_manager),
message_loop_(message_loop),
messages_forwarded_to_channel_(0),
- a_stub_is_descheduled_(false) {
- }
+ a_stub_is_descheduled_(false) {}
virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE {
DCHECK(!channel_);
@@ -153,10 +152,7 @@ class GpuChannelMessageFilter : public IPC::MessageFilter {
}
protected:
- virtual ~GpuChannelMessageFilter() {
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &GpuChannelMessageFilter::DeleteWeakPtrOnMainThread, gpu_channel_));
- }
+ virtual ~GpuChannelMessageFilter() {}
private:
enum PreemptionState {
@@ -337,7 +333,7 @@ class GpuChannelMessageFilter : public IPC::MessageFilter {
}
static void InsertSyncPointOnMainThread(
- base::WeakPtr<GpuChannel>* gpu_channel,
+ base::WeakPtr<GpuChannel> gpu_channel,
scoped_refptr<SyncPointManager> manager,
int32 routing_id,
uint32 sync_point) {
@@ -346,30 +342,23 @@ class GpuChannelMessageFilter : public IPC::MessageFilter {
// with it, but if that fails for any reason (channel or stub already
// deleted, invalid routing id), we need to retire the sync point
// immediately.
- if (gpu_channel->get()) {
- GpuCommandBufferStub* stub = gpu_channel->get()->LookupCommandBuffer(
- routing_id);
+ if (gpu_channel) {
+ GpuCommandBufferStub* stub = gpu_channel->LookupCommandBuffer(routing_id);
if (stub) {
stub->AddSyncPoint(sync_point);
GpuCommandBufferMsg_RetireSyncPoint message(routing_id, sync_point);
- gpu_channel->get()->OnMessageReceived(message);
+ gpu_channel->OnMessageReceived(message);
return;
} else {
- gpu_channel->get()->MessageProcessed();
+ gpu_channel->MessageProcessed();
}
}
manager->RetireSyncPoint(sync_point);
}
- static void DeleteWeakPtrOnMainThread(
- base::WeakPtr<GpuChannel>* gpu_channel) {
- delete gpu_channel;
- }
-
- // NOTE: this is a pointer to a weak pointer. It is never dereferenced on the
- // IO thread, it's only passed through - therefore the WeakPtr assumptions are
- // respected.
- base::WeakPtr<GpuChannel>* gpu_channel_;
+ // NOTE: this weak pointer is never dereferenced on the IO thread, it's only
+ // passed through - therefore the WeakPtr assumptions are respected.
+ base::WeakPtr<GpuChannel> gpu_channel_;
IPC::Channel* channel_;
scoped_refptr<SyncPointManager> sync_point_manager_;
scoped_refptr<base::MessageLoopProxy> message_loop_;
@@ -411,6 +400,11 @@ GpuChannel::GpuChannel(GpuChannelManager* gpu_channel_manager,
log_messages_ = command_line->HasSwitch(switches::kLogPluginMessages);
}
+GpuChannel::~GpuChannel() {
+ STLDeleteElements(&deferred_messages_);
+ if (preempting_flag_.get())
+ preempting_flag_->Reset();
+}
void GpuChannel::Init(base::MessageLoopProxy* io_message_loop,
base::WaitableEvent* shutdown_event) {
@@ -425,13 +419,10 @@ void GpuChannel::Init(base::MessageLoopProxy* io_message_loop,
false,
shutdown_event));
- base::WeakPtr<GpuChannel>* weak_ptr(new base::WeakPtr<GpuChannel>(
- weak_factory_.GetWeakPtr()));
-
- filter_ = new GpuChannelMessageFilter(
- weak_ptr,
- gpu_channel_manager_->sync_point_manager(),
- base::MessageLoopProxy::current());
+ filter_ =
+ new GpuChannelMessageFilter(weak_factory_.GetWeakPtr(),
+ gpu_channel_manager_->sync_point_manager(),
+ base::MessageLoopProxy::current());
io_message_loop_ = io_message_loop;
channel_->AddFilter(filter_.get());
@@ -632,11 +623,6 @@ void GpuChannel::MarkAllContextsLost() {
}
}
-void GpuChannel::DestroySoon() {
- base::MessageLoop::current()->PostTask(
- FROM_HERE, base::Bind(&GpuChannel::OnDestroy, this));
-}
-
bool GpuChannel::AddRoute(int32 route_id, IPC::Listener* listener) {
return router_.AddRoute(route_id, listener);
}
@@ -666,11 +652,6 @@ void GpuChannel::SetPreemptByFlag(
}
}
-GpuChannel::~GpuChannel() {
- if (preempting_flag_.get())
- preempting_flag_->Reset();
-}
-
void GpuChannel::OnDestroy() {
TRACE_EVENT0("gpu", "GpuChannel::OnDestroy");
gpu_channel_manager_->RemoveChannel(client_id_);
« no previous file with comments | « content/common/gpu/gpu_channel.h ('k') | content/common/gpu/gpu_channel_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698