Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / power / freezer_cgroup_process_manager.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/power/freezer_cgroup_process_manager.h"
6
7 #include <string>
8
9 #include "base/files/file_util.h"
10 #include "base/logging.h"
11
12 namespace chromeos {
13
14 namespace {
15 const char kFreezerStatePath[] =
16     "/sys/fs/cgroup/freezer/chrome_renderers/freezer.state";
17 const char kFreezeCommand[] = "FROZEN";
18 const char kThawCommand[] = "THAWED";
19
20 }  // namespace
21
22 FreezerCgroupProcessManager::FreezerCgroupProcessManager()
23     : state_path_(base::FilePath(kFreezerStatePath)),
24       enabled_(base::PathIsWritable(state_path_)) {
25   if (!enabled_) {
26     LOG(WARNING) << "Cgroup freezer does not exist or is not writable. "
27                  << "Unable to freeze renderer processes.";
28   }
29 }
30
31 FreezerCgroupProcessManager::~FreezerCgroupProcessManager() {
32 }
33
34 bool FreezerCgroupProcessManager::FreezeRenderers() {
35   if (!enabled_) {
36     LOG(ERROR) << "Attempting to freeze renderers when the freezer cgroup is "
37                << "not available.";
38     return false;
39   }
40
41   return WriteCommandToStateFile(kFreezeCommand);
42 }
43
44 bool FreezerCgroupProcessManager::ThawRenderers() {
45   if (!enabled_) {
46     LOG(ERROR) << "Attempting to thaw renderers when the freezer cgroup is not "
47                << "available.";
48     return false;
49   }
50
51   return WriteCommandToStateFile(kThawCommand);
52 }
53
54 bool FreezerCgroupProcessManager::CanFreezeRenderers() {
55   return enabled_;
56 }
57
58 bool FreezerCgroupProcessManager::WriteCommandToStateFile(
59     const std::string& command) {
60   int bytes = base::WriteFile(state_path_, command.c_str(), command.size());
61   if (bytes == -1) {
62     PLOG(ERROR) << "Writing " << command << " to " << state_path_.value()
63                 << " failed";
64     return false;
65   } else if (bytes != static_cast<int>(command.size())) {
66     LOG(ERROR) << "Only wrote " << bytes << " byte(s) when writing "
67                << command << " to " << state_path_.value();
68     return false;
69   }
70   return true;
71 }
72
73 }  // namespace chromeos