Chromium Code Reviews| Index: content/browser/memory/swap_metrics_observer_mac.cc |
| diff --git a/content/browser/memory/swap_metrics_observer_mac.cc b/content/browser/memory/swap_metrics_observer_mac.cc |
| index d44b50fe543b11a7d633a3ed138595239157e837..a1c4839505556b1e9d45cfd184ef2498ab0bc455 100644 |
| --- a/content/browser/memory/swap_metrics_observer_mac.cc |
| +++ b/content/browser/memory/swap_metrics_observer_mac.cc |
| @@ -2,14 +2,59 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "content/browser/memory/swap_metrics_observer.h" |
| +#include "content/browser/memory/swap_metrics_observer_mac.h" |
| + |
| +#include <mach/mach.h> |
| +#include <mach/mach_vm.h> |
| + |
| +#include "base/mac/mach_logging.h" |
| +#include "base/metrics/histogram_macros.h" |
| namespace content { |
| // static |
| SwapMetricsObserver* SwapMetricsObserver::GetInstance() { |
| - // TODO(bashi): Implement SwapMetricsObserver for macOS. |
| - return nullptr; |
| + static SwapMetricsObserverMac* instance = new SwapMetricsObserverMac(); |
| + return instance; |
| +} |
| + |
| +SwapMetricsObserverMac::SwapMetricsObserverMac() : host_(mach_host_self()) {} |
| + |
| +SwapMetricsObserverMac::~SwapMetricsObserverMac() {} |
| + |
| +void SwapMetricsObserverMac::UpdateMetricsInternal(base::TimeDelta interval) { |
| + vm_statistics64_data_t statistics; |
| + mach_msg_type_number_t count = HOST_VM_INFO64_COUNT; |
| + int result = |
|
erikchen
2017/05/01 12:19:58
the type should be kern_return_t.
bashi
2017/05/01 22:02:13
Ack. Will change.
|
| + host_statistics64(host_.get(), HOST_VM_INFO64, |
| + reinterpret_cast<host_info64_t>(&statistics), &count); |
| + if (result != KERN_SUCCESS) { |
| + MACH_DLOG(WARNING, result) << "host_statistics64"; |
| + Stop(); |
| + return; |
| + } |
| + DCHECK_EQ(HOST_VM_INFO64_COUNT, count); |
| + |
| + double swapins = statistics.swapins - last_swapins_; |
| + double swapouts = statistics.swapouts - last_swapouts_; |
| + double decompressions = statistics.decompressions - last_decompressions_; |
| + double compressions = statistics.compressions - last_compressions_; |
| + last_swapins_ = statistics.swapins; |
| + last_swapouts_ = statistics.swapouts; |
| + last_decompressions_ = statistics.decompressions; |
| + last_compressions_ = statistics.compressions; |
| + |
| + if (interval.is_zero()) |
| + return; |
| + |
| + UMA_HISTOGRAM_COUNTS_10000("Memory.Experimental.SwapInPerSecond", |
| + swapins / interval.InSecondsF()); |
| + UMA_HISTOGRAM_COUNTS_10000("Memory.Experimental.SwapOutPerSecond", |
| + swapouts / interval.InSecondsF()); |
| + UMA_HISTOGRAM_COUNTS_10000("Memory.Experimental.DecompressedPagesPerSecond", |
| + decompressions / interval.InSecondsF()); |
| + UMA_HISTOGRAM_COUNTS_10000("Memory.Experimental.CompressedPagesPerSecond", |
| + compressions / interval.InSecondsF()); |
| } |
| } // namespace content |