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