summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-24 01:45:10 +0000
committerrtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-24 01:45:10 +0000
commit89fb232c2fa6dd588bda640c2fed57c8ad64aad7 (patch)
treea8117e6bc41bddb1154cc59311eb3ce418be8166
parentdac205a682f70c3b271ce2e36b2fffcbd1309d65 (diff)
downloadchromium_src-89fb232c2fa6dd588bda640c2fed57c8ad64aad7.zip
chromium_src-89fb232c2fa6dd588bda640c2fed57c8ad64aad7.tar.gz
chromium_src-89fb232c2fa6dd588bda640c2fed57c8ad64aad7.tar.bz2
Fixed the memory leak of callback Task in PostPingMessage.
If PostTask to watched thread fails, we will stop monitoring that thread. BUG=73915,73844 TEST=performance testing Review URL: http://codereview.chromium.org/6575007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75838 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/metrics/thread_watcher.cc28
1 files changed, 16 insertions, 12 deletions
diff --git a/chrome/browser/metrics/thread_watcher.cc b/chrome/browser/metrics/thread_watcher.cc
index 15f5b14..cac9afd 100644
--- a/chrome/browser/metrics/thread_watcher.cc
+++ b/chrome/browser/metrics/thread_watcher.cc
@@ -104,18 +104,22 @@ void ThreadWatcher::PostPingMessage() {
// Send a ping message to the watched thread.
Task* callback_task = method_factory_.NewRunnableMethod(
&ThreadWatcher::OnPongMessage, ping_sequence_number_);
- BrowserThread::PostTask(
- thread_id(),
- FROM_HERE,
- NewRunnableFunction(
- &ThreadWatcher::OnPingMessage, thread_id_, callback_task));
-
- // Post a task to check the responsiveness of watched thread.
- MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- method_factory_.NewRunnableMethod(
- &ThreadWatcher::OnCheckResponsiveness, ping_sequence_number_),
- unresponsive_time_.InMilliseconds());
+ if (BrowserThread::PostTask(
+ thread_id(),
+ FROM_HERE,
+ NewRunnableFunction(
+ &ThreadWatcher::OnPingMessage, thread_id_, callback_task))) {
+ // Post a task to check the responsiveness of watched thread.
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ method_factory_.NewRunnableMethod(
+ &ThreadWatcher::OnCheckResponsiveness, ping_sequence_number_),
+ unresponsive_time_.InMilliseconds());
+ } else {
+ // Watched thread might have gone away, stop watching it.
+ delete callback_task;
+ DeActivateThreadWatching();
+ }
}
void ThreadWatcher::OnPongMessage(uint64 ping_sequence_number) {