Home | History | Annotate | Download | only in process
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/process/process_metrics.h"
      6 
      7 #include <limits.h>
      8 #include <stddef.h>
      9 #include <stdint.h>
     10 #include <sys/resource.h>
     11 #include <sys/time.h>
     12 #include <unistd.h>
     13 
     14 #include "base/logging.h"
     15 #include "build/build_config.h"
     16 
     17 namespace base {
     18 
     19 int64_t TimeValToMicroseconds(const struct timeval& tv) {
     20   int64_t ret = tv.tv_sec;  // Avoid (int * int) integer overflow.
     21   ret *= Time::kMicrosecondsPerSecond;
     22   ret += tv.tv_usec;
     23   return ret;
     24 }
     25 
     26 ProcessMetrics::~ProcessMetrics() { }
     27 
     28 #if defined(OS_LINUX)
     29 static const rlim_t kSystemDefaultMaxFds = 8192;
     30 #elif defined(OS_MACOSX)
     31 static const rlim_t kSystemDefaultMaxFds = 256;
     32 #elif defined(OS_SOLARIS)
     33 static const rlim_t kSystemDefaultMaxFds = 8192;
     34 #elif defined(OS_FREEBSD)
     35 static const rlim_t kSystemDefaultMaxFds = 8192;
     36 #elif defined(OS_OPENBSD)
     37 static const rlim_t kSystemDefaultMaxFds = 256;
     38 #elif defined(OS_ANDROID)
     39 static const rlim_t kSystemDefaultMaxFds = 1024;
     40 #endif
     41 
     42 size_t GetMaxFds() {
     43   rlim_t max_fds;
     44   struct rlimit nofile;
     45   if (getrlimit(RLIMIT_NOFILE, &nofile)) {
     46     // getrlimit failed. Take a best guess.
     47     max_fds = kSystemDefaultMaxFds;
     48     RAW_LOG(ERROR, "getrlimit(RLIMIT_NOFILE) failed");
     49   } else {
     50     max_fds = nofile.rlim_cur;
     51   }
     52 
     53   if (max_fds > INT_MAX)
     54     max_fds = INT_MAX;
     55 
     56   return static_cast<size_t>(max_fds);
     57 }
     58 
     59 
     60 void SetFdLimit(unsigned int max_descriptors) {
     61   struct rlimit limits;
     62   if (getrlimit(RLIMIT_NOFILE, &limits) == 0) {
     63     unsigned int new_limit = max_descriptors;
     64     if (limits.rlim_max > 0 && limits.rlim_max < max_descriptors) {
     65       new_limit = limits.rlim_max;
     66     }
     67     limits.rlim_cur = new_limit;
     68     if (setrlimit(RLIMIT_NOFILE, &limits) != 0) {
     69       PLOG(INFO) << "Failed to set file descriptor limit";
     70     }
     71   } else {
     72     PLOG(INFO) << "Failed to get file descriptor limit";
     73   }
     74 }
     75 
     76 size_t GetPageSize() {
     77   return getpagesize();
     78 }
     79 
     80 }  // namespace base
     81