| 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 6116f51df273e7324c4690538cfb90c3addb8d44..edc8e40a275716c43dfbcb092129b5ad79f3500d 100644
|
| --- a/chrome/browser/chromeos/power/renderer_freezer.cc
|
| +++ b/chrome/browser/chromeos/power/renderer_freezer.cc
|
| @@ -4,23 +4,29 @@
|
|
|
| #include "chrome/browser/chromeos/power/renderer_freezer.h"
|
|
|
| -#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 {
|
|
|
| -namespace {
|
| -const char kFreezerStatePath[] =
|
| - "/sys/fs/cgroup/freezer/chrome_renderers/freezer.state";
|
| -const char kFreezeCommand[] = "FROZEN";
|
| -const char kThawCommand[] = "THAWED";
|
| +RendererFreezer::RendererFreezer(scoped_ptr<RendererFreezer::Delegate> delegate)
|
| + : frozen_(false),
|
| + delegate_(delegate.Pass()),
|
| + weak_factory_(this) {
|
| + if (delegate_->CanFreezeRenderers()) {
|
| + DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this);
|
| + } else {
|
| + LOG(WARNING) << "Cgroup freezer does not exist or is not writable. "
|
| + << "Processes will not be frozen during suspend.";
|
| + }
|
| +}
|
|
|
| -} // namespace
|
| +RendererFreezer::~RendererFreezer() {
|
| + if (delegate_->CanFreezeRenderers())
|
| + DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this);
|
| +}
|
|
|
| void RendererFreezer::SuspendImminent() {
|
| suspend_readiness_callback_ = DBusThreadManager::Get()
|
| @@ -37,8 +43,7 @@ void RendererFreezer::SuspendDone(const base::TimeDelta& sleep_duration) {
|
| if (!frozen_)
|
| return;
|
|
|
| - if (base::WriteFile(state_path_, kThawCommand, strlen(kThawCommand)) !=
|
| - static_cast<int>(strlen(kThawCommand))) {
|
| + if (!delegate_->ThawRenderers()) {
|
| // We failed to write the thaw command and the renderers are still frozen.
|
| // We are in big trouble because none of the tabs will be responsive so
|
| // let's crash the browser instead.
|
| @@ -49,35 +54,14 @@ void RendererFreezer::SuspendDone(const base::TimeDelta& sleep_duration) {
|
| }
|
|
|
| void RendererFreezer::OnReadyToSuspend() {
|
| - if (base::WriteFile(state_path_, kFreezeCommand, strlen(kFreezeCommand)) !=
|
| - static_cast<int>(strlen(kFreezeCommand))) {
|
| + if (!delegate_->FreezeRenderers())
|
| PLOG(WARNING) << "Unable to freeze processes in the cgroup freezer.";
|
| - } else {
|
| + 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),
|
| - weak_factory_(this) {
|
| - if (enabled_) {
|
| - DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this);
|
| - } else {
|
| - LOG(WARNING) << "Cgroup freezer does not exist or is not writable. "
|
| - << "Processes will not be frozen during suspend.";
|
| - }
|
| -}
|
| -
|
| -RendererFreezer::~RendererFreezer() {
|
| - if (enabled_)
|
| - DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this);
|
| -}
|
| -
|
| } // namespace chromeos
|
|
|