/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-7 by Raw Material Software ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License, as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with JUCE; if not, visit www.gnu.org/licenses or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ------------------------------------------------------------------------------ If you'd like to release a closed-source product which uses JUCE, commercial licenses are also available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #include "linuxincludes.h" #include "../../../src/juce_core/basics/juce_StandardHeader.h" #include #include #ifndef CPU_ISSET #undef SUPPORT_AFFINITIES #endif BEGIN_JUCE_NAMESPACE #include "../../../src/juce_core/io/files/juce_File.h" #include "../../../src/juce_core/basics/juce_SystemStats.h" #include "../../../src/juce_core/threads/juce_Process.h" #include "../../../src/juce_appframework/events/juce_Timer.h" #include "../../../src/juce_core/misc/juce_PlatformUtilities.h" //============================================================================== /*static juce_noinline unsigned int getCPUIDWord (int* familyModel, int* extFeatures) throw() { unsigned int cpu = 0; unsigned int ext = 0; unsigned int family = 0; unsigned int dummy = 0; #if JUCE_64BIT __asm__ ("cpuid" : "=a" (family), "=b" (ext), "=c" (dummy), "=d" (cpu) : "a" (1)); #else __asm__ ("push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" : "=a" (family), "=D" (ext), "=c" (dummy), "=d" (cpu) : "a" (1)); #endif if (familyModel != 0) *familyModel = family; if (extFeatures != 0) *extFeatures = ext; return cpu; }*/ //============================================================================== void Logger::outputDebugString (const String& text) throw() { fputs (text.toUTF8(), stdout); fputs ("\n", stdout); } void Logger::outputDebugPrintf (const tchar* format, ...) throw() { String text; va_list args; va_start (args, format); text.vprintf(format, args); outputDebugString(text); } SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() throw() { return Linux; } const String SystemStats::getOperatingSystemName() throw() { return T("Linux"); } bool SystemStats::isOperatingSystem64Bit() throw() { #if JUCE_64BIT return true; #else //xxx not sure how to find this out?.. return false; #endif } static const String getCpuInfo (const char* key, bool lastOne = false) throw() { String info; char buf [256]; FILE* f = fopen ("/proc/cpuinfo", "r"); while (f != 0 && fgets (buf, sizeof(buf), f)) { if (strncmp (buf, key, strlen (key)) == 0) { char* p = buf; while (*p && *p != '\n') ++p; if (*p != 0) *p = 0; p = buf; while (*p != 0 && *p != ':') ++p; if (*p != 0 && *(p + 1) != 0) info = p + 2; if (! lastOne) break; } } fclose (f); return info; } bool SystemStats::hasMMX() throw() { return getCpuInfo ("flags").contains (T("mmx")); } bool SystemStats::hasSSE() throw() { return getCpuInfo ("flags").contains (T("sse")); } bool SystemStats::hasSSE2() throw() { return getCpuInfo ("flags").contains (T("sse2")); } bool SystemStats::has3DNow() throw() { return getCpuInfo ("flags").contains (T("3dnow")); } const String SystemStats::getCpuVendor() throw() { return getCpuInfo ("vendor_id"); } int SystemStats::getCpuSpeedInMegaherz() throw() { const String speed (getCpuInfo ("cpu MHz")); return (int) (speed.getFloatValue() + 0.5f); } int SystemStats::getMemorySizeInMegabytes() throw() { struct sysinfo sysi; if (sysinfo (&sysi) == 0) return (sysi.totalram * sysi.mem_unit / (1024 * 1024)); return 0; } uint32 juce_millisecondsSinceStartup() throw() { static unsigned int calibrate = 0; static bool calibrated = false; timeval t; unsigned int ret = 0; if (! gettimeofday (&t, 0)) { if (! calibrated) { struct sysinfo sysi; if (sysinfo (&sysi) == 0) // Safe to assume system was not brought up earlier than 1970! calibrate = t.tv_sec - sysi.uptime; calibrated = true; } ret = 1000 * (t.tv_sec - calibrate) + (t.tv_usec / 1000); } return ret; } double Time::getMillisecondCounterHiRes() throw() { return getHighResolutionTicks() * 0.001; } int64 Time::getHighResolutionTicks() throw() { timeval t; if (gettimeofday (&t, 0)) return 0; return ((int64) t.tv_sec * (int64) 1000000) + (int64) t.tv_usec; } int64 Time::getHighResolutionTicksPerSecond() throw() { // Microseconds return 1000000; } bool Time::setSystemTimeToThisTime() const throw() { timeval t; t.tv_sec = millisSinceEpoch % 1000000; t.tv_usec = millisSinceEpoch - t.tv_sec; return settimeofday (&t, NULL) ? false : true; } int SystemStats::getPageSize() throw() { static int systemPageSize = 0; if (systemPageSize == 0) systemPageSize = sysconf (_SC_PAGESIZE); return systemPageSize; } int SystemStats::getNumCpus() throw() { const int lastCpu = getCpuInfo ("processor", true).getIntValue(); return lastCpu + 1; } //============================================================================== void SystemStats::initialiseStats() throw() { // Process starts off as root when running suid Process::lowerPrivilege(); String s (SystemStats::getJUCEVersion()); } void PlatformUtilities::fpuReset() { } END_JUCE_NAMESPACE