190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/process/process_metrics.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <mach/task.h>
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace base {
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace {
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool GetTaskInfo(task_basic_info_64* task_info_data) {
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kern_return_t kr = task_info(mach_task_self(),
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               TASK_BASIC_INFO_64,
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               reinterpret_cast<task_info_t>(task_info_data),
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               &count);
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return kr == KERN_SUCCESS;
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ProcessMetrics::ProcessMetrics(ProcessHandle process) {}
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ProcessMetrics::~ProcessMetrics() {}
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ProcessMetrics* ProcessMetrics::CreateProcessMetrics(ProcessHandle process) {
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return new ProcessMetrics(process);
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)size_t ProcessMetrics::GetPagefileUsage() const {
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  task_basic_info_64 task_info_data;
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!GetTaskInfo(&task_info_data))
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return 0;
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return task_info_data.virtual_size;
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)size_t ProcessMetrics::GetWorkingSetSize() const {
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  task_basic_info_64 task_info_data;
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!GetTaskInfo(&task_info_data))
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return 0;
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return task_info_data.resident_size;
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t GetMaxFds() {
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static const rlim_t kSystemDefaultMaxFds = 256;
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  rlim_t max_fds;
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  struct rlimit nofile;
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (getrlimit(RLIMIT_NOFILE, &nofile)) {
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Error case: Take a best guess.
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    max_fds = kSystemDefaultMaxFds;
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    max_fds = nofile.rlim_cur;
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (max_fds > INT_MAX)
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    max_fds = INT_MAX;
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return static_cast<size_t>(max_fds);
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SetFdLimit(unsigned int max_descriptors) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Unimplemented.
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace base
69