1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_info.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <errno.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h>
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/param.h>
1000d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#ifndef ANDROID
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/statvfs.h>
1200d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#endif
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/sysctl.h>
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/utsname.h>
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h>
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1700d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#if !defined(OS_MACOSX) && !defined(ANDROID)
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gdk/gdk.h>
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/utf_string_conversions.h"
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_OPENBSD)
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::NumberOfProcessors() {
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // It seems that sysconf returns the number of "logical" processors on both
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Mac and Linux.  So we get the number of "online logical" processors.
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  long res = sysconf(_SC_NPROCESSORS_ONLN);
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (res == -1) {
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 1;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(res);
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfFreeDiskSpace(const FilePath& path) {
4400d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#ifdef ANDROID
4500d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch  return -1;
4600d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#else
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct statvfs stats;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (statvfs(path.value().c_str(), &stats) != 0) {
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return -1;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int64>(stats.f_bavail) * stats.f_frsize;
5200d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#endif
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemName() {
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  utsname info;
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (uname(&info) < 0) {
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return "";
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return std::string(info.sysname);
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemVersion() {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  utsname info;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (uname(&info) < 0) {
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return "";
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return std::string(info.release);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::CPUArchitecture() {
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  utsname info;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (uname(&info) < 0) {
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return "";
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return std::string(info.machine);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_MACOSX)
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) {
8800d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#ifdef ANDROID
8900d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch  return;
9000d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#else
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Note that Bad Things Happen if this isn't called from the UI thread,
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // but also that there's no way to check that from here.  :(
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GdkScreen* screen = gdk_screen_get_default();
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (width)
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *width = gdk_screen_get_width(screen);
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (height)
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *height = gdk_screen_get_height(screen);
9800d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#endif
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::DisplayCount() {
10300d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#ifdef ANDROID
10400d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch  return 1;
10500d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#else
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Note that Bad Things Happen if this isn't called from the UI thread,
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // but also that there's no way to check that from here.  :(
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This query is kinda bogus for Linux -- do we want number of X screens?
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The number of monitors Xinerama has?  We'll just use whatever GDK uses.
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GdkScreen* screen = gdk_screen_get_default();
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return gdk_screen_get_n_monitors(screen);
11300d26a728db2814620f390b418a7d6325ce5aca6Ben Murdoch#endif
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t SysInfo::VMAllocationGranularity() {
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return getpagesize();
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
123