OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "crash-reporter/unclean_shutdown_collector.h" | 5 #include "crash-reporter/unclean_shutdown_collector.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "crash-reporter/system_logging.h" | 9 #include "crash-reporter/system_logging.h" |
10 | 10 |
11 static const char kUncleanShutdownFile[] = | 11 static const char kUncleanShutdownFile[] = |
12 "/var/lib/crash_reporter/pending_clean_shutdown"; | 12 "/var/lib/crash_reporter/pending_clean_shutdown"; |
13 | 13 |
14 // Files created by power manager used for crash reporting. | |
15 static const FilePath kPowerdTracePath = FilePath("/var/lib/power_manager"); | |
tfarina
2010/11/19 15:35:43
Please, don't do this.
See http://groups.google.co
tfarina
2010/11/19 15:35:43
Can you use FILE_PATH_LITERAL instead?
kmixter1
2010/11/19 20:02:02
Fair enough, I retract my statement about doing th
| |
16 // File with timestamp of last suspend. | |
17 static const char kPowerdSuspendFile[] = "powerd_suspending"; | |
18 // File with timestamp of last resume. | |
19 static const char kPowerdResumeFile[] = "powerd_resuming"; | |
20 // Presence of this file indicates that the battery is critically low. | |
21 static const char kPowerdLowBatteryFile[] = "powerd_low_battery"; | |
22 | |
14 UncleanShutdownCollector::UncleanShutdownCollector() | 23 UncleanShutdownCollector::UncleanShutdownCollector() |
15 : unclean_shutdown_file_(kUncleanShutdownFile) { | 24 : unclean_shutdown_file_(kUncleanShutdownFile) { |
16 } | 25 } |
17 | 26 |
18 UncleanShutdownCollector::~UncleanShutdownCollector() { | 27 UncleanShutdownCollector::~UncleanShutdownCollector() { |
19 } | 28 } |
20 | 29 |
21 bool UncleanShutdownCollector::Enable() { | 30 bool UncleanShutdownCollector::Enable() { |
22 FilePath file_path(unclean_shutdown_file_); | 31 FilePath file_path(unclean_shutdown_file_); |
23 file_util::CreateDirectory(file_path.DirName()); | 32 file_util::CreateDirectory(file_path.DirName()); |
(...skipping 14 matching lines...) Expand all Loading... | |
38 } | 47 } |
39 | 48 |
40 bool UncleanShutdownCollector::Collect() { | 49 bool UncleanShutdownCollector::Collect() { |
41 FilePath unclean_file_path(unclean_shutdown_file_); | 50 FilePath unclean_file_path(unclean_shutdown_file_); |
42 if (!file_util::PathExists(unclean_file_path)) { | 51 if (!file_util::PathExists(unclean_file_path)) { |
43 return false; | 52 return false; |
44 } | 53 } |
45 logger_->LogWarning("Last shutdown was not clean"); | 54 logger_->LogWarning("Last shutdown was not clean"); |
46 DeleteUncleanShutdownFile(); | 55 DeleteUncleanShutdownFile(); |
47 | 56 |
57 // Check for unclean shutdown due to battery running out. | |
tfarina
2010/11/19 15:35:43
This comment is good. I'd add it in the header fil
kmixter1
2010/11/19 20:02:02
I'd name the function to indicate this: CheckForDe
| |
58 CheckPowerdFiles(); | |
59 | |
48 if (is_feedback_allowed_function_()) { | 60 if (is_feedback_allowed_function_()) { |
49 count_crash_function_(); | 61 count_crash_function_(); |
50 } | 62 } |
51 return true; | 63 return true; |
52 } | 64 } |
53 | 65 |
54 bool UncleanShutdownCollector::Disable() { | 66 bool UncleanShutdownCollector::Disable() { |
55 logger_->LogInfo("Clean shutdown signalled"); | 67 logger_->LogInfo("Clean shutdown signalled"); |
68 file_util::Delete(kPowerdTracePath.Append(kPowerdSuspendFile), false); | |
69 file_util::Delete(kPowerdTracePath.Append(kPowerdResumeFile), false); | |
70 file_util::Delete(kPowerdTracePath.Append(kPowerdLowBatteryFile), false); | |
56 return DeleteUncleanShutdownFile(); | 71 return DeleteUncleanShutdownFile(); |
57 } | 72 } |
73 | |
74 bool UncleanShutdownCollector::ReadModificationTime(const FilePath &file_path, | |
75 base::Time *mod_time) | |
76 { | |
tfarina
2010/11/19 15:35:43
the { should be in the end of the previous line.
| |
77 file_util::FileInfo file_info; | |
tfarina
2010/11/19 15:35:43
Please, move this inside the first if, close where
| |
78 base::Time::Exploded timestamp; | |
tfarina
2010/11/19 15:35:43
Please, move this inside the if too.
| |
79 // Initialize timestamp fields to prevent warnings during print. | |
80 timestamp.hour = -1; | |
81 timestamp.minute = -1; | |
82 timestamp.second = -1; | |
83 // Log the file modification time if it exists. | |
84 if (file_util::PathExists(file_path)) { | |
tfarina
2010/11/19 15:35:43
You can return early. I think it's better.
if (!f
| |
85 if (!GetFileInfo(file_path, &file_info)) | |
86 return false; | |
87 file_info.last_modified.LocalExplode(×tamp); | |
88 logger_->LogInfo("%s modified at %02d:%02d:%02d", file_path.value().c_str(), | |
89 timestamp.hour, timestamp.minute, timestamp.second); | |
90 // Return the timestamp. | |
91 if (mod_time != NULL) | |
92 *mod_time = base::Time::FromLocalExploded(timestamp); | |
93 return true; | |
94 } | |
95 return false; | |
96 } | |
97 | |
98 bool UncleanShutdownCollector::CheckPowerdFiles() | |
99 { | |
tfarina
2010/11/19 15:35:43
the { should be on the previous line.
| |
100 logger_->LogInfo("Checking for Power Daemon files"); | |
kmixter1
2010/11/19 20:02:02
This seems pretty chatty as we already emit a few
| |
101 | |
102 base::Time suspend_time, resume_time, low_battery_time; | |
103 bool was_suspended = ReadModificationTime(kPowerdTracePath. | |
104 Append(kPowerdSuspendFile), &suspend_time); | |
tfarina
2010/11/19 15:35:43
wrong indentation. Indent 4 spaces. Better, if pos
| |
105 bool was_resumed = ReadModificationTime(kPowerdTracePath. | |
kmixter1
2010/11/19 20:02:02
I would move these down to where they're actually
| |
106 Append(kPowerdResumeFile), &resume_time); | |
107 bool running_on_low_battery = ReadModificationTime(kPowerdTracePath. | |
108 Append(kPowerdLowBatteryFile), &low_battery_time); | |
109 bool battery_ran_out = false; | |
110 | |
111 if (was_suspended) { | |
kmixter1
2010/11/19 20:02:02
Once the Delete calls are factored out you can mak
| |
112 // Check for case of battery running out while suspended. | |
113 if (!was_resumed || (was_resumed && resume_time < suspend_time)) { | |
114 logger_->LogInfo("Unclean shutdown occurred while suspended. The battery " | |
115 "probably ran out."); | |
116 battery_ran_out = true; | |
117 // Check for case of battery running out after resuming from a low-battery | |
118 // suspend. | |
119 } else if (was_suspended && was_resumed && resume_time > suspend_time && | |
kmixter1
2010/11/19 20:02:02
I think the whole first line of this is redundant.
| |
120 running_on_low_battery && low_battery_time <= suspend_time) { | |
121 | |
tfarina
2010/11/19 15:35:43
remove this blank line.
| |
122 logger_->LogInfo("Unclean shutdown occurred while resumed after battery " | |
123 "was critically low. The battery probably ran out."); | |
124 battery_ran_out = true; | |
125 } | |
126 } | |
127 | |
128 file_util::Delete(kPowerdTracePath.Append(kPowerdSuspendFile), false); | |
kmixter1
2010/11/19 20:02:02
Please separate this out into a function with a na
| |
129 file_util::Delete(kPowerdTracePath.Append(kPowerdResumeFile), false); | |
130 file_util::Delete(kPowerdTracePath.Append(kPowerdLowBatteryFile), false); | |
131 | |
132 return battery_ran_out; | |
133 } | |
OLD | NEW |