Index: chrome/browser/chromeos/power/renderer_freezer.cc |
diff --git a/chrome/browser/chromeos/power/renderer_freezer.cc b/chrome/browser/chromeos/power/renderer_freezer.cc |
index e3f81c0250a14eccb293459faf58f3e1c61d6e7c..6116f51df273e7324c4690538cfb90c3addb8d44 100644 |
--- a/chrome/browser/chromeos/power/renderer_freezer.cc |
+++ b/chrome/browser/chromeos/power/renderer_freezer.cc |
@@ -6,8 +6,10 @@ |
#include <cstring> // needed for strlen() |
+#include "base/bind.h" |
#include "base/files/file_util.h" |
#include "base/logging.h" |
+#include "base/message_loop/message_loop.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
namespace chromeos { |
@@ -21,12 +23,14 @@ const char kThawCommand[] = "THAWED"; |
} // namespace |
void RendererFreezer::SuspendImminent() { |
- if (base::WriteFile(state_path_, kFreezeCommand, strlen(kFreezeCommand)) != |
- static_cast<int>(strlen(kFreezeCommand))) { |
- PLOG(WARNING) << "Unable to freeze processes in the cgroup freezer."; |
- } else { |
- frozen_ = true; |
- } |
+ suspend_readiness_callback_ = DBusThreadManager::Get() |
+ ->GetPowerManagerClient() |
+ ->GetSuspendReadinessCallback(); |
+ |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&RendererFreezer::OnReadyToSuspend, |
+ weak_factory_.GetWeakPtr())); |
} |
void RendererFreezer::SuspendDone(const base::TimeDelta& sleep_duration) { |
@@ -44,11 +48,25 @@ void RendererFreezer::SuspendDone(const base::TimeDelta& sleep_duration) { |
frozen_ = false; |
} |
+void RendererFreezer::OnReadyToSuspend() { |
+ if (base::WriteFile(state_path_, kFreezeCommand, strlen(kFreezeCommand)) != |
+ static_cast<int>(strlen(kFreezeCommand))) { |
+ PLOG(WARNING) << "Unable to freeze processes in the cgroup freezer."; |
+ } else { |
+ frozen_ = true; |
+ } |
+ |
+ DCHECK(!suspend_readiness_callback_.is_null()); |
+ suspend_readiness_callback_.Run(); |
+ suspend_readiness_callback_.Reset(); |
+} |
+ |
RendererFreezer::RendererFreezer() |
: state_path_(base::FilePath(kFreezerStatePath)), |
enabled_(base::PathExists(state_path_) && |
base::PathIsWritable(state_path_)), |
- frozen_(false) { |
+ frozen_(false), |
+ weak_factory_(this) { |
if (enabled_) { |
DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); |
} else { |