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