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 |