13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/process/process_metrics.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/values.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace base {
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SystemMetrics::SystemMetrics() {
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  committed_memory_ = 0;
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SystemMetrics SystemMetrics::Sample() {
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SystemMetrics system_metrics;
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  system_metrics.committed_memory_ = GetSystemCommitCharge();
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID)
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GetSystemMemoryInfo(&system_metrics.memory_info_);
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetSystemDiskInfo(&system_metrics.disk_info_);
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_CHROMEOS)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetSwapInfo(&system_metrics.swap_info_);
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return system_metrics;
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<Value> SystemMetrics::ToValue() const {
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<DictionaryValue> res(new DictionaryValue());
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  res->SetInteger("committed_memory", static_cast<int>(committed_memory_));
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID)
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  res->Set("meminfo", memory_info_.ToValue().release());
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  res->Set("diskinfo", disk_info_.ToValue().release());
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_CHROMEOS)
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  res->Set("swapinfo", swap_info_.ToValue().release());
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return res.PassAs<Value>();
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)double ProcessMetrics::GetPlatformIndependentCPUUsage() {
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_WIN)
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return GetCPUUsage() * processor_count_;
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return GetCPUUsage();
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) || defined(OS_LINUX)
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ProcessMetrics::CalculateIdleWakeupsPerSecond(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    uint64 absolute_idle_wakeups) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TimeTicks time = TimeTicks::Now();
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (last_absolute_idle_wakeups_ == 0) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // First call, just set the last values.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_idle_wakeups_time_ = time;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_absolute_idle_wakeups_ = absolute_idle_wakeups;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int64 wakeups_delta = absolute_idle_wakeups - last_absolute_idle_wakeups_;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int64 time_delta = (time - last_idle_wakeups_time_).InMicroseconds();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (time_delta == 0) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  last_idle_wakeups_time_ = time;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  last_absolute_idle_wakeups_ = absolute_idle_wakeups;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Round to average wakeups per second.
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int64 wakeups_delta_for_ms = wakeups_delta * Time::kMicrosecondsPerSecond;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return (wakeups_delta_for_ms + time_delta / 2) / time_delta;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int ProcessMetrics::GetIdleWakeupsPerSecond() {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTIMPLEMENTED();  // http://crbug.com/120488
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return 0;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // defined(OS_MACOSX) || defined(OS_LINUX)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace base
88