// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "tools/memory/simulator/process_metrics_provider_mac.h"
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <mach/mach_vm.h>
#include "base/apple/mach_logging.h"
#include "base/apple/scoped_mach_port.h"
#include "base/time/time.h"
#include "tools/memory/simulator/utils.h"
namespace memory_simulator {
ProcessMetricsProviderMac::ProcessMetricsProviderMac() = default;
ProcessMetricsProviderMac::~ProcessMetricsProviderMac() = default;
std::vector<std::string> ProcessMetricsProviderMac::GetMetricNames() {
return {"process_resident(gb)", "process_internal(gb)",
"process_external(gb)", "process_compressed(gb)",
"process_physical(gb)"};
}
std::map<std::string, double> ProcessMetricsProviderMac::GetMetricValues(
base::TimeTicks now) {
std::map<std::string, double> metrics;
task_vm_info process_info;
mach_msg_type_number_t count = TASK_VM_INFO_REV2_COUNT;
kern_return_t result =
task_info(mach_task_self(), TASK_VM_INFO,
reinterpret_cast<task_info_t>(&process_info), &count);
CHECK_EQ(result, KERN_SUCCESS);
metrics["process_resident(gb)"] = BytesToGB(process_info.resident_size);
metrics["process_internal(gb)"] = BytesToGB(process_info.internal);
metrics["process_external(gb)"] = BytesToGB(process_info.external);
metrics["process_compressed(gb)"] = BytesToGB(process_info.compressed);
metrics["process_physical(gb)"] = BytesToGB(process_info.phys_footprint);
return metrics;
}
} // namespace memory_simulator