summaryrefslogtreecommitdiffstats
path: root/google_apis
diff options
context:
space:
mode:
authorzea <zea@chromium.org>2015-09-23 16:26:50 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-23 23:27:32 +0000
commitb388c75b293fb4b0ae394ff75683416aa0a8c5ab (patch)
tree0adb47056b8ef58b46fa9f767c2c937eb86edd14 /google_apis
parent90e01f99ec58a64e339a2d87983f0fdd7fb4bde1 (diff)
downloadchromium_src-b388c75b293fb4b0ae394ff75683416aa0a8c5ab.zip
chromium_src-b388c75b293fb4b0ae394ff75683416aa0a8c5ab.tar.gz
chromium_src-b388c75b293fb4b0ae394ff75683416aa0a8c5ab.tar.bz2
[GCM] Fix crash in heartbeat manager
If the power monitor triggers notifies the manager before it gets started, we might attempt to invoke a null callback. BUG=535182 Review URL: https://codereview.chromium.org/1364023002 Cr-Commit-Position: refs/heads/master@{#350385}
Diffstat (limited to 'google_apis')
-rw-r--r--google_apis/gcm/engine/heartbeat_manager.cc18
1 files changed, 13 insertions, 5 deletions
diff --git a/google_apis/gcm/engine/heartbeat_manager.cc b/google_apis/gcm/engine/heartbeat_manager.cc
index 9875912..0e78b02 100644
--- a/google_apis/gcm/engine/heartbeat_manager.cc
+++ b/google_apis/gcm/engine/heartbeat_manager.cc
@@ -46,10 +46,6 @@ HeartbeatManager::HeartbeatManager()
heartbeat_timer_(new base::Timer(true /* retain_user_task */,
false /* is_repeating */)),
weak_ptr_factory_(this) {
- // Listen for system suspend and resume events.
- base::PowerMonitor* monitor = base::PowerMonitor::Get();
- if (monitor)
- monitor->AddObserver(this);
}
HeartbeatManager::~HeartbeatManager() {
@@ -67,6 +63,11 @@ void HeartbeatManager::Start(
send_heartbeat_callback_ = send_heartbeat_callback;
trigger_reconnect_callback_ = trigger_reconnect_callback;
+ // Listen for system suspend and resume events.
+ base::PowerMonitor* monitor = base::PowerMonitor::Get();
+ if (monitor)
+ monitor->AddObserver(this);
+
// Kicks off the timer.
waiting_for_ack_ = false;
RestartTimer();
@@ -77,6 +78,10 @@ void HeartbeatManager::Stop() {
heartbeat_interval_ms_ = 0;
heartbeat_timer_->Stop();
waiting_for_ack_ = false;
+
+ base::PowerMonitor* monitor = base::PowerMonitor::Get();
+ if (monitor)
+ monitor->RemoveObserver(this);
}
void HeartbeatManager::OnHeartbeatAcked() {
@@ -135,7 +140,10 @@ void HeartbeatManager::OnResume() {
// Make sure a minimum amount of time has passed before forcing a heartbeat to
// avoid any tight loop scenarios.
- if (elapsed > base::TimeDelta::FromMilliseconds(kMinSuspendTimeMs))
+ // If the |send_heartbeat_callback_| is null, it means the heartbeat manager
+ // hasn't been started, so do nothing.
+ if (elapsed > base::TimeDelta::FromMilliseconds(kMinSuspendTimeMs) &&
+ !send_heartbeat_callback_.is_null())
OnHeartbeatTriggered();
}