Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: base/process/process_metrics_win.cc

Issue 139103007: Use TimeTicks instead of gettimeofday in ProcessMetrics. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reverty Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/process/process_metrics_openbsd.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium 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 "base/process/process_metrics.h" 5 #include "base/process/process_metrics.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <psapi.h> 8 #include <psapi.h>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 } 188 }
189 189
190 static uint64 FileTimeToUTC(const FILETIME& ftime) { 190 static uint64 FileTimeToUTC(const FILETIME& ftime) {
191 LARGE_INTEGER li; 191 LARGE_INTEGER li;
192 li.LowPart = ftime.dwLowDateTime; 192 li.LowPart = ftime.dwLowDateTime;
193 li.HighPart = ftime.dwHighDateTime; 193 li.HighPart = ftime.dwHighDateTime;
194 return li.QuadPart; 194 return li.QuadPart;
195 } 195 }
196 196
197 double ProcessMetrics::GetCPUUsage() { 197 double ProcessMetrics::GetCPUUsage() {
198 FILETIME now;
199 FILETIME creation_time; 198 FILETIME creation_time;
200 FILETIME exit_time; 199 FILETIME exit_time;
201 FILETIME kernel_time; 200 FILETIME kernel_time;
202 FILETIME user_time; 201 FILETIME user_time;
203 202
204 GetSystemTimeAsFileTime(&now);
205
206 if (!GetProcessTimes(process_, &creation_time, &exit_time, 203 if (!GetProcessTimes(process_, &creation_time, &exit_time,
207 &kernel_time, &user_time)) { 204 &kernel_time, &user_time)) {
208 // We don't assert here because in some cases (such as in the Task Manager) 205 // We don't assert here because in some cases (such as in the Task Manager)
209 // we may call this function on a process that has just exited but we have 206 // we may call this function on a process that has just exited but we have
210 // not yet received the notification. 207 // not yet received the notification.
211 return 0; 208 return 0;
212 } 209 }
213 int64 system_time = (FileTimeToUTC(kernel_time) + FileTimeToUTC(user_time)) / 210 int64 system_time = (FileTimeToUTC(kernel_time) + FileTimeToUTC(user_time)) /
214 processor_count_; 211 processor_count_;
215 int64 time = FileTimeToUTC(now); 212 TimeTicks time = TimeTicks::Now();
216 213
217 if ((last_system_time_ == 0) || (last_cpu_time_ == 0)) { 214 if (last_system_time_ == 0) {
218 // First call, just set the last values. 215 // First call, just set the last values.
219 last_system_time_ = system_time; 216 last_system_time_ = system_time;
220 last_cpu_time_ = time; 217 last_cpu_time_ = time;
221 return 0; 218 return 0;
222 } 219 }
223 220
224 int64 system_time_delta = system_time - last_system_time_; 221 int64 system_time_delta = system_time - last_system_time_;
225 int64 time_delta = time - last_cpu_time_; 222 // FILETIME is in 100-nanosecond units, so this needs microseconds times 10.
223 int64 time_delta = (time - last_cpu_time_).InMicroseconds() * 10;
226 DCHECK_NE(0U, time_delta); 224 DCHECK_NE(0U, time_delta);
227 if (time_delta == 0) 225 if (time_delta == 0)
228 return 0; 226 return 0;
229 227
230 // We add time_delta / 2 so the result is rounded. 228 // We add time_delta / 2 so the result is rounded.
231 int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) / 229 int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) /
232 time_delta); 230 time_delta);
233 231
234 last_system_time_ = system_time; 232 last_system_time_ = system_time;
235 last_cpu_time_ = time; 233 last_cpu_time_ = time;
(...skipping 26 matching lines...) Expand all
262 return true; 260 return true;
263 } 261 }
264 262
265 bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const { 263 bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const {
266 return GetProcessIoCounters(process_, io_counters) != FALSE; 264 return GetProcessIoCounters(process_, io_counters) != FALSE;
267 } 265 }
268 266
269 ProcessMetrics::ProcessMetrics(ProcessHandle process) 267 ProcessMetrics::ProcessMetrics(ProcessHandle process)
270 : process_(process), 268 : process_(process),
271 processor_count_(base::SysInfo::NumberOfProcessors()), 269 processor_count_(base::SysInfo::NumberOfProcessors()),
272 last_cpu_time_(0),
273 last_system_time_(0) { 270 last_system_time_(0) {
274 } 271 }
275 272
276 // GetPerformanceInfo is not available on WIN2K. So we'll 273 // GetPerformanceInfo is not available on WIN2K. So we'll
277 // load it on-the-fly. 274 // load it on-the-fly.
278 const wchar_t kPsapiDllName[] = L"psapi.dll"; 275 const wchar_t kPsapiDllName[] = L"psapi.dll";
279 typedef BOOL (WINAPI *GetPerformanceInfoFunction) ( 276 typedef BOOL (WINAPI *GetPerformanceInfoFunction) (
280 PPERFORMANCE_INFORMATION pPerformanceInformation, 277 PPERFORMANCE_INFORMATION pPerformanceInformation,
281 DWORD cb); 278 DWORD cb);
282 279
(...skipping 23 matching lines...) Expand all
306 303
307 PERFORMANCE_INFORMATION info; 304 PERFORMANCE_INFORMATION info;
308 if (!InternalGetPerformanceInfo(&info, sizeof(info))) { 305 if (!InternalGetPerformanceInfo(&info, sizeof(info))) {
309 DLOG(ERROR) << "Failed to fetch internal performance info."; 306 DLOG(ERROR) << "Failed to fetch internal performance info.";
310 return 0; 307 return 0;
311 } 308 }
312 return (info.CommitTotal * system_info.dwPageSize) / 1024; 309 return (info.CommitTotal * system_info.dwPageSize) / 1024;
313 } 310 }
314 311
315 } // namespace base 312 } // namespace base
OLDNEW
« no previous file with comments | « base/process/process_metrics_openbsd.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698