diff options
author | husky@chromium.org <husky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-19 18:02:03 +0000 |
---|---|---|
committer | husky@chromium.org <husky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-19 18:02:03 +0000 |
commit | 0d5c21b8b6b46d6349d22c3c7839016fcb8f6fc4 (patch) | |
tree | d86d3b17c6ff49c7a46dfee710ba084345e49b3b /content/browser/trace_subscriber_stdio.cc | |
parent | df97de1f11639736b8cdcc4301458b56bde955ea (diff) | |
download | chromium_src-0d5c21b8b6b46d6349d22c3c7839016fcb8f6fc4.zip chromium_src-0d5c21b8b6b46d6349d22c3c7839016fcb8f6fc4.tar.gz chromium_src-0d5c21b8b6b46d6349d22c3c7839016fcb8f6fc4.tar.bz2 |
Fix memory leak in TraceSubscriberStdioImpl.
This class uses TraceBuffer internally, via a callback object.
The callback references the TraceSubscriberStdioImpl so there
was a reference cycle. Fixed by explicitly clearing the callback.
BUG=115411
TEST=TraceSubscriberStdioTest under Valgrind
Review URL: https://chromiumcodereview.appspot.com/10797012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@147482 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/trace_subscriber_stdio.cc')
-rw-r--r-- | content/browser/trace_subscriber_stdio.cc | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/content/browser/trace_subscriber_stdio.cc b/content/browser/trace_subscriber_stdio.cc index e390212..a102810 100644 --- a/content/browser/trace_subscriber_stdio.cc +++ b/content/browser/trace_subscriber_stdio.cc @@ -58,6 +58,9 @@ class TraceSubscriberStdioImpl fclose(file_); file_ = 0; } + // This is important, as it breaks a reference cycle. + trace_buffer_.SetOutputCallback( + base::debug::TraceResultBuffer::OutputCallback()); } void Write(const std::string& output_str) { @@ -79,7 +82,7 @@ TraceSubscriberStdio::TraceSubscriberStdio(const FilePath& path) : impl_(new TraceSubscriberStdioImpl(path)) { BrowserThread::PostBlockingPoolSequencedTask( __FILE__, FROM_HERE, - base::Bind(&TraceSubscriberStdioImpl::OnStart, impl_.get())); + base::Bind(&TraceSubscriberStdioImpl::OnStart, impl_)); } TraceSubscriberStdio::~TraceSubscriberStdio() { @@ -88,14 +91,14 @@ TraceSubscriberStdio::~TraceSubscriberStdio() { void TraceSubscriberStdio::OnEndTracingComplete() { BrowserThread::PostBlockingPoolSequencedTask( __FILE__, FROM_HERE, - base::Bind(&TraceSubscriberStdioImpl::OnEnd, impl_.get())); + base::Bind(&TraceSubscriberStdioImpl::OnEnd, impl_)); } void TraceSubscriberStdio::OnTraceDataCollected( const scoped_refptr<base::RefCountedString>& data_ptr) { BrowserThread::PostBlockingPoolSequencedTask( __FILE__, FROM_HERE, - base::Bind(&TraceSubscriberStdioImpl::OnData, impl_.get(), data_ptr)); + base::Bind(&TraceSubscriberStdioImpl::OnData, impl_, data_ptr)); } } // namespace content |