Index: base/process/process_metrics_posix.cc |
diff --git a/base/process/process_metrics_posix.cc b/base/process/process_metrics_posix.cc |
index 3422a730dce691847b886de4f092c1720ede0c2f..531f6a40d701444ea77c290130221ad502642198 100644 |
--- a/base/process/process_metrics_posix.cc |
+++ b/base/process/process_metrics_posix.cc |
@@ -4,8 +4,11 @@ |
#include "base/process/process_metrics.h" |
+#include <sys/resource.h> |
#include <sys/time.h> |
+#include "base/logging.h" |
+ |
namespace base { |
int64 TimeValToMicroseconds(const struct timeval& tv) { |
@@ -18,4 +21,35 @@ int64 TimeValToMicroseconds(const struct timeval& tv) { |
ProcessMetrics::~ProcessMetrics() { } |
+#if defined(OS_LINUX) |
+static const rlim_t kSystemDefaultMaxFds = 8192; |
+#elif defined(OS_MACOSX) |
+static const rlim_t kSystemDefaultMaxFds = 256; |
+#elif defined(OS_SOLARIS) |
+static const rlim_t kSystemDefaultMaxFds = 8192; |
+#elif defined(OS_FREEBSD) |
+static const rlim_t kSystemDefaultMaxFds = 8192; |
+#elif defined(OS_OPENBSD) |
+static const rlim_t kSystemDefaultMaxFds = 256; |
+#elif defined(OS_ANDROID) |
+static const rlim_t kSystemDefaultMaxFds = 1024; |
+#endif |
+ |
+size_t GetMaxFds() { |
+ rlim_t max_fds; |
+ struct rlimit nofile; |
+ if (getrlimit(RLIMIT_NOFILE, &nofile)) { |
+ // getrlimit failed. Take a best guess. |
+ max_fds = kSystemDefaultMaxFds; |
+ RAW_LOG(ERROR, "getrlimit(RLIMIT_NOFILE) failed"); |
+ } else { |
+ max_fds = nofile.rlim_cur; |
+ } |
+ |
+ if (max_fds > INT_MAX) |
+ max_fds = INT_MAX; |
+ |
+ return static_cast<size_t>(max_fds); |
+} |
+ |
} // namespace base |