diff options
author | Michael Lauer <mickey@vanille-media.de> | 2006-04-19 17:15:59 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2006-04-19 17:15:59 +0000 |
commit | d6c212ff5889b904e3207cfd7bfffef4d87c0233 (patch) | |
tree | 38b1eb9344eb64493fb08b264ce5fac9c36c375c /packages/juce/files/remove-x86isms.patch | |
parent | 49a15ddc54beed55432aa1830d544e9361d13127 (diff) |
add juce, a very nice C++ application framework. the .bb is WIP
Diffstat (limited to 'packages/juce/files/remove-x86isms.patch')
-rw-r--r-- | packages/juce/files/remove-x86isms.patch | 2353 |
1 files changed, 2353 insertions, 0 deletions
diff --git a/packages/juce/files/remove-x86isms.patch b/packages/juce/files/remove-x86isms.patch new file mode 100644 index 0000000000..83016f733a --- /dev/null +++ b/packages/juce/files/remove-x86isms.patch @@ -0,0 +1,2353 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- juce/src/juce_core/basics/juce_Atomic.h~remove-x86isms.patch ++++ juce/src/juce_core/basics/juce_Atomic.h +@@ -1,188 +1,200 @@ +-/*
+- ==============================================================================
+-
+- This file is part of the JUCE library - "Jules' Utility Class Extensions"
+- Copyright 2004-6 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.
+-
+- ==============================================================================
+-*/
+-
+-#ifndef __JUCE_ATOMIC_JUCEHEADER__
+-#define __JUCE_ATOMIC_JUCEHEADER__
+-
+-// Atomic increment/decrement operations..
+-
+-//==============================================================================
+-#if JUCE_MAC && ! DOXYGEN
+- #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
+- #include <libkern/OSAtomic.h>
+-
+- forcedinline void atomicIncrement (int& variable) throw()
+- {
+- OSAtomicIncrement32 ((int32_t*) &variable);
+- }
+-
+- forcedinline int atomicIncrementAndReturn (int& variable) throw()
+- {
+- return OSAtomicIncrement32 ((int32_t*) &variable);
+- }
+-
+- forcedinline void atomicDecrement (int& variable) throw()
+- {
+- OSAtomicDecrement32 ((int32_t*) &variable);
+- }
+-
+- forcedinline int atomicDecrementAndReturn (int& variable) throw()
+- {
+- return OSAtomicDecrement32 ((int32_t*) &variable);
+- }
+-
+- #else
+- forcedinline void atomicIncrement (int& variable) throw()
+- {
+- OTAtomicAdd32 (1, (SInt32*) &variable);
+- }
+-
+- forcedinline int atomicIncrementAndReturn (int& variable) throw()
+- {
+- return OTAtomicAdd32 (1, (SInt32*) &variable);
+- }
+-
+- forcedinline void atomicDecrement (int& variable) throw()
+- {
+- OTAtomicAdd32 (-1, (SInt32*) &variable);
+- }
+-
+- forcedinline int atomicDecrementAndReturn (int& variable) throw()
+- {
+- return OTAtomicAdd32 (-1, (SInt32*) &variable);
+- }
+- #endif
+-#else
+-#ifdef __GNUC__
+-
+- /** Increments an integer in a thread-safe way. */
+- forcedinline void atomicIncrement (int& variable) throw()
+- {
+- __asm__ __volatile (
+- "lock incl (%%ecx)"
+- :
+- : "c" (&variable));
+- }
+-
+- /** Increments an integer in a thread-safe way and returns the incremented value. */
+- forcedinline int atomicIncrementAndReturn (int& variable) throw()
+- {
+- int result;
+-
+- __asm__ __volatile (
+- "lock xaddl %%eax, (%%ebx) \n\
+- incl %%eax"
+- : "=a" (result)
+- : "b" (&variable), "a" (1)
+- : "cc", "memory");
+-
+- return result;
+- }
+-
+- /** Decrememts an integer in a thread-safe way. */
+- forcedinline void atomicDecrement (int& variable) throw()
+- {
+- __asm__ __volatile (
+- "lock decl (%%ecx)"
+- :
+- : "c" (&variable));
+- }
+-
+- /** Decrememts an integer in a thread-safe way and returns the incremented value. */
+- forcedinline int atomicDecrementAndReturn (int& variable) throw()
+- {
+- int result;
+-
+- __asm__ __volatile (
+- "lock xaddl %%eax, (%%ebx) \n\
+- decl %%eax"
+- : "=a" (result)
+- : "b" (&variable), "a" (-1)
+- : "cc", "memory");
+-
+- return result;
+- }
+-
+-#else
+-
+- /** Increments an integer in a thread-safe way. */
+- inline_assembly void __fastcall atomicIncrement (int& variable) throw()
+- {
+- __asm {
+- mov ecx, dword ptr [variable]
+- lock inc dword ptr [ecx]
+- }
+- }
+-
+- /** Increments an integer in a thread-safe way and returns the incremented value. */
+- inline_assembly int __fastcall atomicIncrementAndReturn (int& variable) throw()
+- {
+- int result;
+-
+- __asm {
+- mov ecx, dword ptr [variable]
+- mov eax, 1
+- lock xadd dword ptr [ecx], eax
+- inc eax
+- mov result, eax
+- }
+-
+- return result;
+- }
+-
+- /** Decrememts an integer in a thread-safe way. */
+- inline_assembly void __fastcall atomicDecrement (int& variable) throw()
+- {
+- __asm {
+- mov ecx, dword ptr [variable]
+- lock dec dword ptr [ecx]
+- }
+- }
+-
+- /** Decrememts an integer in a thread-safe way and returns the incremented value. */
+- inline_assembly int __fastcall atomicDecrementAndReturn (int& variable) throw()
+- {
+- int result;
+-
+- __asm {
+- mov ecx, dword ptr [variable]
+- mov eax, -1
+- lock xadd dword ptr [ecx], eax
+- dec eax
+- mov result, eax
+- }
+-
+- return result;
+- }
+-#endif
+-#endif
+-
+-#endif // __JUCE_ATOMIC_JUCEHEADER__
++/* ++ ============================================================================== ++ ++ This file is part of the JUCE library - "Jules' Utility Class Extensions" ++ Copyright 2004-6 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. ++ ++ ============================================================================== ++*/ ++ ++#ifndef __JUCE_ATOMIC_JUCEHEADER__ ++#define __JUCE_ATOMIC_JUCEHEADER__ ++ ++// Atomic increment/decrement operations.. ++ ++//============================================================================== ++#if JUCE_MAC && ! DOXYGEN ++ #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4) ++ #include <libkern/OSAtomic.h> ++ ++ forcedinline void atomicIncrement (int& variable) throw() ++ { ++ OSAtomicIncrement32 ((int32_t*) &variable); ++ } ++ ++ forcedinline int atomicIncrementAndReturn (int& variable) throw() ++ { ++ return OSAtomicIncrement32 ((int32_t*) &variable); ++ } ++ ++ forcedinline void atomicDecrement (int& variable) throw() ++ { ++ OSAtomicDecrement32 ((int32_t*) &variable); ++ } ++ ++ forcedinline int atomicDecrementAndReturn (int& variable) throw() ++ { ++ return OSAtomicDecrement32 ((int32_t*) &variable); ++ } ++ ++ #else ++ forcedinline void atomicIncrement (int& variable) throw() ++ { ++ OTAtomicAdd32 (1, (SInt32*) &variable); ++ } ++ ++ forcedinline int atomicIncrementAndReturn (int& variable) throw() ++ { ++ return OTAtomicAdd32 (1, (SInt32*) &variable); ++ } ++ ++ forcedinline void atomicDecrement (int& variable) throw() ++ { ++ OTAtomicAdd32 (-1, (SInt32*) &variable); ++ } ++ ++ forcedinline int atomicDecrementAndReturn (int& variable) throw() ++ { ++ return OTAtomicAdd32 (-1, (SInt32*) &variable); ++ } ++ #endif ++#else ++#ifdef __GNUC__ ++ ++ /** Increments an integer in a thread-safe way. */ ++ forcedinline void atomicIncrement (int& variable) throw() ++ { ++#ifndef __x86__ ++ variable++; ++#else ++ __asm__ __volatile ( ++ "lock incl (%%ecx)" ++ : ++ : "c" (&variable)); ++#endif ++ } ++ ++ /** Increments an integer in a thread-safe way and returns the incremented value. */ ++ forcedinline int atomicIncrementAndReturn (int& variable) throw() ++ { ++ int result; ++#ifndef __x86__ ++ result = ++variable; ++#else ++ __asm__ __volatile ( ++ "lock xaddl %%eax, (%%ebx) \n\ ++ incl %%eax" ++ : "=a" (result) ++ : "b" (&variable), "a" (1) ++ : "cc", "memory"); ++#endif ++ return result; ++ } ++ ++ /** Decrememts an integer in a thread-safe way. */ ++ forcedinline void atomicDecrement (int& variable) throw() ++ { ++#ifndef __x86__ ++ variable--; ++#else ++ __asm__ __volatile ( ++ "lock decl (%%ecx)" ++ : ++ : "c" (&variable)); ++#endif ++ } ++ ++ /** Decrememts an integer in a thread-safe way and returns the incremented value. */ ++ forcedinline int atomicDecrementAndReturn (int& variable) throw() ++ { ++ int result; ++#ifndef __x86__ ++ result = --variable; ++#else ++ __asm__ __volatile ( ++ "lock xaddl %%eax, (%%ebx) \n\ ++ decl %%eax" ++ : "=a" (result) ++ : "b" (&variable), "a" (-1) ++ : "cc", "memory"); ++#endif ++ return result; ++ } ++ ++#else ++ ++ /** Increments an integer in a thread-safe way. */ ++ inline_assembly void __fastcall atomicIncrement (int& variable) throw() ++ { ++ __asm { ++ mov ecx, dword ptr [variable] ++ lock inc dword ptr [ecx] ++ } ++ } ++ ++ /** Increments an integer in a thread-safe way and returns the incremented value. */ ++ inline_assembly int __fastcall atomicIncrementAndReturn (int& variable) throw() ++ { ++ int result; ++ ++ __asm { ++ mov ecx, dword ptr [variable] ++ mov eax, 1 ++ lock xadd dword ptr [ecx], eax ++ inc eax ++ mov result, eax ++ } ++ ++ return result; ++ } ++ ++ /** Decrememts an integer in a thread-safe way. */ ++ inline_assembly void __fastcall atomicDecrement (int& variable) throw() ++ { ++ __asm { ++ mov ecx, dword ptr [variable] ++ lock dec dword ptr [ecx] ++ } ++ } ++ ++ /** Decrememts an integer in a thread-safe way and returns the incremented value. */ ++ inline_assembly int __fastcall atomicDecrementAndReturn (int& variable) throw() ++ { ++ int result; ++ ++ __asm { ++ mov ecx, dword ptr [variable] ++ mov eax, -1 ++ lock xadd dword ptr [ecx], eax ++ dec eax ++ mov result, eax ++ } ++ ++ return result; ++ } ++#endif ++#endif ++ ++#endif // __JUCE_ATOMIC_JUCEHEADER__ +--- juce/src/juce_core/basics/juce_PlatformDefs.h~remove-x86isms.patch ++++ juce/src/juce_core/basics/juce_PlatformDefs.h +@@ -1,326 +1,330 @@ +-/*
+- ==============================================================================
+-
+- This file is part of the JUCE library - "Jules' Utility Class Extensions"
+- Copyright 2004-6 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.
+-
+- ==============================================================================
+-*/
+-
+-#ifndef __JUCE_PLATFORMDEFS_JUCEHEADER__
+-#define __JUCE_PLATFORMDEFS_JUCEHEADER__
+-
+-
+-//==============================================================================
+-// set up platform definitions..
+-#ifdef _WIN32
+- #define JUCE_WIN32 1
+- #define JUCE_WINDOWS 1
+-#else
+- #ifdef LINUX
+- #define JUCE_LINUX 1
+- #else
+- #define JUCE_MAC 1
+- #endif
+-#endif
+-
+-//==============================================================================
+-#ifdef JUCE_WINDOWS
+- #ifdef _MSC_VER
+- #ifdef _WIN64
+- #define JUCE_64BIT 1
+- #else
+- #define JUCE_32BIT 1
+- #endif
+- #endif
+-
+- #ifdef _DEBUG
+- #define JUCE_DEBUG 1
+- #endif
+-
+- /** If defined, this indicates that the processor is little-endian. */
+- #define JUCE_LITTLE_ENDIAN 1
+-
+- #define JUCE_INTEL 1
+-#endif
+-
+-//==============================================================================
+-#ifdef JUCE_MAC
+-
+- #include <CoreServices/CoreServices.h>
+- #include <wchar.h>
+-
+- #ifndef NDEBUG
+- #define JUCE_DEBUG 1
+- #endif
+-
+- #ifdef __LITTLE_ENDIAN__
+- #define JUCE_LITTLE_ENDIAN 1
+- #else
+- #define JUCE_BIG_ENDIAN 1
+- #endif
+-
+- #if defined (__ppc__) || defined (__ppc64__)
+- #define JUCE_PPC 1
+- #else
+- #define JUCE_INTEL 1
+- #endif
+-
+- #ifdef __LP64__
+- #define JUCE_64BIT 1
+- #else
+- #define JUCE_32BIT 1
+- #endif
+-#endif
+-
+-//==============================================================================
+-#ifdef JUCE_LINUX
+-
+- #ifdef _DEBUG
+- #define JUCE_DEBUG 1
+- #endif
+-
+- #include <wchar.h>
+-
+- // Allow override for big-endian Linux platforms
+- #ifndef JUCE_BIG_ENDIAN
+- #define JUCE_LITTLE_ENDIAN 1
+- #endif
+-
+- #if defined (__LP64__) || defined (_LP64)
+- #define JUCE_64BIT 1
+- #else
+- #define JUCE_32BIT 1
+- #endif
+-
+- #define JUCE_INTEL 1
+-#endif
+-
+-//==============================================================================
+-#if defined (__GNUC__) || defined (__MWERKS__)
+- /** A platform-independent 64-bit integer type. */
+- typedef long long int64;
+- /** A platform-independent 64-bit unsigned integer type. */
+- typedef unsigned long long uint64;
+- /** A platform-independent unicode character type. */
+- typedef wchar_t juce_wchar;
+-
+- /** A platform-independent way of forcing an inline function.
+-
+- Use the syntax: @code
+- forcedinline void myfunction (int x)
+- @endcode
+- */
+- #ifndef JUCE_DEBUG
+- #define forcedinline inline __attribute__((always_inline))
+- #else
+- #define forcedinline inline
+- #endif
+-
+- /** A platform-independent way of stopping the compiler inlining a function.
+-
+- Use the syntax: @code
+- juce_noinline void myfunction (int x)
+- @endcode
+- */
+- #define juce_noinline __attribute__((noinline))
+-
+-#else
+- //==============================================================================
+- /** A platform-independent 64-bit integer type. */
+- typedef __int64 int64;
+- /** A platform-independent 64-bit unsigned integer type. */
+- typedef unsigned __int64 uint64;
+-
+- /** A platform-independent unicode character type. */
+- typedef wchar_t juce_wchar;
+-
+- /** A platform-independent way of forcing an inline function.
+-
+- Use the syntax: @code
+- forcedinline void myfunction (int x)
+- @endcode
+- */
+- #ifdef _MSC_VER
+- #define forcedinline __forceinline
+- #else
+- #define forcedinline inline
+- #endif
+-
+- /** A platform-independent way of stopping the compiler inlining a function.
+-
+- Use the syntax: @code
+- juce_noinline void myfunction (int x)
+- @endcode
+- */
+- #define juce_noinline
+-
+-#endif
+-
+-#if JUCE_64BIT
+- typedef int64 pointer_sized_int;
+- typedef uint64 pointer_sized_uint;
+-#else
+- #if _MSC_VER >= 1300
+- typedef _W64 int pointer_sized_int;
+- typedef _W64 unsigned int pointer_sized_uint;
+- #else
+- typedef int pointer_sized_int;
+- typedef unsigned int pointer_sized_uint;
+- #endif
+-#endif
+-
+-
+-// borland can't handle inline functions containing asm code, so define a
+-// special type of inline modifier for this kind of function. Sigh..
+-#ifdef __BORLANDC__
+- #define inline_assembly
+-#else
+- #define inline_assembly forcedinline
+-#endif
+-
+-//==============================================================================
+-typedef signed char int8;
+-typedef unsigned char uint8;
+-typedef signed short int16;
+-typedef unsigned short uint16;
+-typedef signed int int32;
+-typedef unsigned int uint32;
+-
+-
+-//==============================================================================
+-// Debugging macros
+-//
+-
+-#ifdef JUCE_DEBUG
+- //==============================================================================
+- // If debugging is enabled..
+-
+- /** Writes a string to the standard error stream.
+-
+- This is only compiled in a debug build.
+-
+- @see Logger::outputDebugString
+- */
+- #define DBG(dbgtext) Logger::outputDebugString (dbgtext);
+-
+- /** Printf's a string to the standard error stream.
+-
+- This is only compiled in a debug build.
+-
+- @see Logger::outputDebugString
+- */
+- #define DBG_PRINTF(dbgprintf) Logger::outputDebugPrintf dbgprintf;
+-
+- // Assertions..
+- #if defined (_MSC_VER) || DOXYGEN
+- /** This will always cause an assertion failure.
+-
+- This is only compiled in a debug build.
+-
+- @see jassert()
+- */
+- #ifdef __BORLANDC__
+- extern void juce_StopInDebugger();
+- #define jassertfalse { juce_StopInDebugger(); }
+- #else
+- #define jassertfalse { __asm int 3 }
+- #endif
+- #elif defined (JUCE_MAC)
+- #define jassertfalse { Debugger(); }
+- #elif defined (__GNUC__) || defined (JUCE_LINUX)
+- #define jassertfalse { asm("int $3"); }
+- #endif
+-
+- //==============================================================================
+- /** Platform-independent assertion macro.
+-
+- This gets optimised out when not being built with debugging turned on.
+-
+- Be careful not to call any functions within its arguments that are vital to
+- the behaviour of the program, because these won't get called in the release
+- build.
+-
+- @see jassertfalse
+- */
+- #define jassert(a) { if (! (a)) jassertfalse }
+-
+-#else
+- //==============================================================================
+- // If debugging is disabled, disable all the assertions and debugging stuff..
+-
+- #define DBG(dbgtext)
+- #define DBG_PRINTF(dbgprintf)
+-
+- #define jassert(a) {}
+- #define jassertfalse {}
+-
+-#endif
+-
+-//==============================================================================
+-#ifndef DOXYGEN
+- template <bool b> struct JuceStaticAssert;
+- template <> struct JuceStaticAssert <true> { static void dummy() {} };
+-#endif
+-
+-/** A compile-time assertion macro.
+-
+- If the expression parameter is false, the macro will cause a compile error.
+-*/
+-#define static_jassert(expression) JuceStaticAssert<expression>::dummy();
+-
+-
+-//==============================================================================
+-#if JUCE_CATCH_UNHANDLED_EXCEPTIONS
+-
+- #define JUCE_TRY try
+-
+- /** Used in try-catch blocks, this macro will send exceptions to the JUCEApplication
+- object so they can be logged by the application if it wants to.
+- */
+- #define JUCE_CATCH_EXCEPTION \
+- catch (const std::exception& e) \
+- { \
+- JUCEApplication::sendUnhandledException (&e, __FILE__, __LINE__); \
+- } \
+- catch (...) \
+- { \
+- JUCEApplication::sendUnhandledException (0, __FILE__, __LINE__); \
+- }
+-
+- #define JUCE_CATCH_ALL catch (...) {}
+- #define JUCE_CATCH_ALL_ASSERT catch (...) { jassertfalse }
+-
+-#else
+-
+- #define JUCE_TRY
+- #define JUCE_CATCH_EXCEPTION
+- #define JUCE_CATCH_ALL
+- #define JUCE_CATCH_ALL_ASSERT
+-
+-#endif
+-
+-
+-#endif // __JUCE_PLATFORMDEFS_JUCEHEADER__
++/* ++ ============================================================================== ++ ++ This file is part of the JUCE library - "Jules' Utility Class Extensions" ++ Copyright 2004-6 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. ++ ++ ============================================================================== ++*/ ++ ++#ifndef __JUCE_PLATFORMDEFS_JUCEHEADER__ ++#define __JUCE_PLATFORMDEFS_JUCEHEADER__ ++ ++ ++//============================================================================== ++// set up platform definitions.. ++#ifdef _WIN32 ++ #define JUCE_WIN32 1 ++ #define JUCE_WINDOWS 1 ++#else ++ #ifdef LINUX ++ #define JUCE_LINUX 1 ++ #else ++ #define JUCE_MAC 1 ++ #endif ++#endif ++ ++//============================================================================== ++#ifdef JUCE_WINDOWS ++ #ifdef _MSC_VER ++ #ifdef _WIN64 ++ #define JUCE_64BIT 1 ++ #else ++ #define JUCE_32BIT 1 ++ #endif ++ #endif ++ ++ #ifdef _DEBUG ++ #define JUCE_DEBUG 1 ++ #endif ++ ++ /** If defined, this indicates that the processor is little-endian. */ ++ #define JUCE_LITTLE_ENDIAN 1 ++ ++ #define JUCE_INTEL 1 ++#endif ++ ++//============================================================================== ++#ifdef JUCE_MAC ++ ++ #include <CoreServices/CoreServices.h> ++ #include <wchar.h> ++ ++ #ifndef NDEBUG ++ #define JUCE_DEBUG 1 ++ #endif ++ ++ #ifdef __LITTLE_ENDIAN__ ++ #define JUCE_LITTLE_ENDIAN 1 ++ #else ++ #define JUCE_BIG_ENDIAN 1 ++ #endif ++ ++ #if defined (__ppc__) || defined (__ppc64__) ++ #define JUCE_PPC 1 ++ #else ++ #define JUCE_INTEL 1 ++ #endif ++ ++ #ifdef __LP64__ ++ #define JUCE_64BIT 1 ++ #else ++ #define JUCE_32BIT 1 ++ #endif ++#endif ++ ++//============================================================================== ++#ifdef JUCE_LINUX ++ ++ #ifdef _DEBUG ++ #define JUCE_DEBUG 1 ++ #endif ++ ++ #include <wchar.h> ++ ++ // Allow override for big-endian Linux platforms ++ #ifndef JUCE_BIG_ENDIAN ++ #define JUCE_LITTLE_ENDIAN 1 ++ #endif ++ ++ #if defined (__LP64__) || defined (_LP64) ++ #define JUCE_64BIT 1 ++ #else ++ #define JUCE_32BIT 1 ++ #endif ++ ++ #define JUCE_INTEL 1 ++#endif ++ ++//============================================================================== ++#if defined (__GNUC__) || defined (__MWERKS__) ++ /** A platform-independent 64-bit integer type. */ ++ typedef long long int64; ++ /** A platform-independent 64-bit unsigned integer type. */ ++ typedef unsigned long long uint64; ++ /** A platform-independent unicode character type. */ ++ typedef wchar_t juce_wchar; ++ ++ /** A platform-independent way of forcing an inline function. ++ ++ Use the syntax: @code ++ forcedinline void myfunction (int x) ++ @endcode ++ */ ++ #ifndef JUCE_DEBUG ++ #define forcedinline inline __attribute__((always_inline)) ++ #else ++ #define forcedinline inline ++ #endif ++ ++ /** A platform-independent way of stopping the compiler inlining a function. ++ ++ Use the syntax: @code ++ juce_noinline void myfunction (int x) ++ @endcode ++ */ ++ #define juce_noinline __attribute__((noinline)) ++ ++#else ++ //============================================================================== ++ /** A platform-independent 64-bit integer type. */ ++ typedef __int64 int64; ++ /** A platform-independent 64-bit unsigned integer type. */ ++ typedef unsigned __int64 uint64; ++ ++ /** A platform-independent unicode character type. */ ++ typedef wchar_t juce_wchar; ++ ++ /** A platform-independent way of forcing an inline function. ++ ++ Use the syntax: @code ++ forcedinline void myfunction (int x) ++ @endcode ++ */ ++ #ifdef _MSC_VER ++ #define forcedinline __forceinline ++ #else ++ #define forcedinline inline ++ #endif ++ ++ /** A platform-independent way of stopping the compiler inlining a function. ++ ++ Use the syntax: @code ++ juce_noinline void myfunction (int x) ++ @endcode ++ */ ++ #define juce_noinline ++ ++#endif ++ ++#if JUCE_64BIT ++ typedef int64 pointer_sized_int; ++ typedef uint64 pointer_sized_uint; ++#else ++ #if _MSC_VER >= 1300 ++ typedef _W64 int pointer_sized_int; ++ typedef _W64 unsigned int pointer_sized_uint; ++ #else ++ typedef int pointer_sized_int; ++ typedef unsigned int pointer_sized_uint; ++ #endif ++#endif ++ ++ ++// borland can't handle inline functions containing asm code, so define a ++// special type of inline modifier for this kind of function. Sigh.. ++#ifdef __BORLANDC__ ++ #define inline_assembly ++#else ++ #define inline_assembly forcedinline ++#endif ++ ++//============================================================================== ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef signed short int16; ++typedef unsigned short uint16; ++typedef signed int int32; ++typedef unsigned int uint32; ++ ++ ++//============================================================================== ++// Debugging macros ++// ++ ++#ifdef JUCE_DEBUG ++ //============================================================================== ++ // If debugging is enabled.. ++ ++ /** Writes a string to the standard error stream. ++ ++ This is only compiled in a debug build. ++ ++ @see Logger::outputDebugString ++ */ ++ #define DBG(dbgtext) Logger::outputDebugString (dbgtext); ++ ++ /** Printf's a string to the standard error stream. ++ ++ This is only compiled in a debug build. ++ ++ @see Logger::outputDebugString ++ */ ++ #define DBG_PRINTF(dbgprintf) Logger::outputDebugPrintf dbgprintf; ++ ++ // Assertions.. ++ #if defined (_MSC_VER) || DOXYGEN ++ /** This will always cause an assertion failure. ++ ++ This is only compiled in a debug build. ++ ++ @see jassert() ++ */ ++ #ifdef __BORLANDC__ ++ extern void juce_StopInDebugger(); ++ #define jassertfalse { juce_StopInDebugger(); } ++ #else ++ #define jassertfalse { __asm int 3 } ++ #endif ++ #elif defined (JUCE_MAC) ++ #define jassertfalse { Debugger(); } ++ #elif defined (__GNUC__) || defined (JUCE_LINUX) ++ #ifndef __x86__ ++ #define jassertfalse { 1/0; } ++ #else ++ #define jassertfalse { asm("int $3"); } ++ #endif ++ #endif ++ ++ //============================================================================== ++ /** Platform-independent assertion macro. ++ ++ This gets optimised out when not being built with debugging turned on. ++ ++ Be careful not to call any functions within its arguments that are vital to ++ the behaviour of the program, because these won't get called in the release ++ build. ++ ++ @see jassertfalse ++ */ ++ #define jassert(a) { if (! (a)) jassertfalse } ++ ++#else ++ //============================================================================== ++ // If debugging is disabled, disable all the assertions and debugging stuff.. ++ ++ #define DBG(dbgtext) ++ #define DBG_PRINTF(dbgprintf) ++ ++ #define jassert(a) {} ++ #define jassertfalse {} ++ ++#endif ++ ++//============================================================================== ++#ifndef DOXYGEN ++ template <bool b> struct JuceStaticAssert; ++ template <> struct JuceStaticAssert <true> { static void dummy() {} }; ++#endif ++ ++/** A compile-time assertion macro. ++ ++ If the expression parameter is false, the macro will cause a compile error. ++*/ ++#define static_jassert(expression) JuceStaticAssert<expression>::dummy(); ++ ++ ++//============================================================================== ++#if JUCE_CATCH_UNHANDLED_EXCEPTIONS ++ ++ #define JUCE_TRY try ++ ++ /** Used in try-catch blocks, this macro will send exceptions to the JUCEApplication ++ object so they can be logged by the application if it wants to. ++ */ ++ #define JUCE_CATCH_EXCEPTION \ ++ catch (const std::exception& e) \ ++ { \ ++ JUCEApplication::sendUnhandledException (&e, __FILE__, __LINE__); \ ++ } \ ++ catch (...) \ ++ { \ ++ JUCEApplication::sendUnhandledException (0, __FILE__, __LINE__); \ ++ } ++ ++ #define JUCE_CATCH_ALL catch (...) {} ++ #define JUCE_CATCH_ALL_ASSERT catch (...) { jassertfalse } ++ ++#else ++ ++ #define JUCE_TRY ++ #define JUCE_CATCH_EXCEPTION ++ #define JUCE_CATCH_ALL ++ #define JUCE_CATCH_ALL_ASSERT ++ ++#endif ++ ++ ++#endif // __JUCE_PLATFORMDEFS_JUCEHEADER__ +--- juce/src/juce_core/basics/juce_DataConversions.h~remove-x86isms.patch ++++ juce/src/juce_core/basics/juce_DataConversions.h +@@ -1,172 +1,176 @@ +-/*
+- ==============================================================================
+-
+- This file is part of the JUCE library - "Jules' Utility Class Extensions"
+- Copyright 2004-6 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.
+-
+- ==============================================================================
+-*/
+-
+-#ifndef __JUCE_DATACONVERSIONS_JUCEHEADER__
+-#define __JUCE_DATACONVERSIONS_JUCEHEADER__
+-
+-#include "juce_PlatformDefs.h"
+-
+-//==============================================================================
+-// Endianness conversions..
+-
+-/** Swaps the byte-order in an integer from little to big-endianness or vice-versa. */
+-inline_assembly uint32 swapByteOrder (uint32 n) throw()
+-{
+-#ifdef JUCE_MAC
+- return CFSwapInt32 (n);
+-#else
+- #ifdef __GNUC__
+- // Inpenetrable GCC version..
+- asm("bswap %%eax" : "=a"(n) : "a"(n));
+- return n;
+- #else
+- // Win32 version..
+- __asm {
+- mov eax, n
+- bswap eax
+- mov n, eax
+- }
+- return n;
+- #endif
+-#endif
+-}
+-
+-/** Swaps the byte-order of a 16-bit short. */
+-inline uint16 swapByteOrder (const uint16 n) throw()
+-{
+- return (uint16) ((n << 8) | (n >> 8));
+-}
+-
+-inline uint64 swapByteOrder (const uint64 value) throw()
+-{
+-#ifdef JUCE_MAC
+- return CFSwapInt64 (value);
+-#else
+- return (((int64) swapByteOrder ((uint32) value)) << 32)
+- | swapByteOrder ((uint32) (value >> 32));
+-#endif
+-}
+-
+-#ifdef JUCE_LITTLE_ENDIAN
+- /** Swaps the byte order of a 16-bit int if the CPU is big-endian */
+- inline uint16 swapIfBigEndian (const uint16 v) throw() { return v; }
+- /** Swaps the byte order of a 32-bit int if the CPU is big-endian */
+- inline uint32 swapIfBigEndian (const uint32 v) throw() { return v; }
+- /** Swaps the byte order of a 16-bit int if the CPU is little-endian */
+- inline uint16 swapIfLittleEndian (const uint16 v) throw() { return swapByteOrder (v); }
+- /** Swaps the byte order of a 32-bit int if the CPU is little-endian */
+- inline uint32 swapIfLittleEndian (const uint32 v) throw() { return swapByteOrder (v); }
+-
+- /** Turns 4 bytes into a little-endian integer. */
+- inline uint32 littleEndianInt (const char* const bytes) throw() { return *(uint32*) bytes; }
+-
+- /** Turns 2 bytes into a little-endian integer. */
+- inline uint16 littleEndianShort (const char* const bytes) throw() { return *(uint16*) bytes; }
+-
+- /** Turns 4 bytes into a big-endian integer. */
+- inline uint32 bigEndianInt (const char* const bytes) throw() { return swapByteOrder (*(uint32*) bytes); }
+-
+- /** Turns 2 bytes into a big-endian integer. */
+- inline uint16 bigEndianShort (const char* const bytes) throw() { return swapByteOrder (*(uint16*) bytes); }
+-
+-#else
+- /** Swaps the byte order of a 16-bit int if the CPU is big-endian */
+- inline uint16 swapIfBigEndian (const uint16 v) throw() { return swapByteOrder (v); }
+- /** Swaps the byte order of a 32-bit int if the CPU is big-endian */
+- inline uint32 swapIfBigEndian (const uint32 v) throw() { return swapByteOrder (v); }
+- /** Swaps the byte order of a 16-bit int if the CPU is little-endian */
+- inline uint16 swapIfLittleEndian (const uint16 v) throw() { return v; }
+- /** Swaps the byte order of a 32-bit int if the CPU is little-endian */
+- inline uint32 swapIfLittleEndian (const uint32 v) throw() { return v; }
+-
+- /** Turns 4 bytes into a little-endian integer. */
+- inline uint32 littleEndianInt (const char* const bytes) throw() { return swapByteOrder (*(uint32*) bytes); }
+-
+- /** Turns 2 bytes into a little-endian integer. */
+- inline uint16 littleEndianShort (const char* const bytes) throw() { return swapByteOrder (*(uint16*) bytes); }
+-
+- /** Turns 4 bytes into a big-endian integer. */
+- inline uint32 bigEndianInt (const char* const bytes) throw() { return *(uint32*) bytes; }
+-
+- /** Turns 2 bytes into a big-endian integer. */
+- inline uint16 bigEndianShort (const char* const bytes) throw() { return *(uint16*) bytes; }
+-#endif
+-
+-/** Converts 3 little-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */
+-inline int littleEndian24Bit (const char* const bytes) throw() { return (((int) bytes[2]) << 16) | (((uint32) (uint8) bytes[1]) << 8) | ((uint32) (uint8) bytes[0]); }
+-/** Converts 3 big-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */
+-inline int bigEndian24Bit (const char* const bytes) throw() { return (((int) bytes[0]) << 16) | (((uint32) (uint8) bytes[1]) << 8) | ((uint32) (uint8) bytes[2]); }
+-
+-/** Copies a 24-bit number to 3 little-endian bytes. */
+-inline void littleEndian24BitToChars (const int value, char* const destBytes) throw() { destBytes[0] = (char)(value & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)((value >> 16) & 0xff); }
+-/** Copies a 24-bit number to 3 big-endian bytes. */
+-inline void bigEndian24BitToChars (const int value, char* const destBytes) throw() { destBytes[0] = (char)((value >> 16) & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)(value & 0xff); }
+-
+-
+-//==============================================================================
+-/** Fast floating-point-to-integer conversion.
+-
+- This is faster than using the normal c++ cast to convert a double to an int, and
+- it will round the value to the nearest integer, rather than rounding it down
+- like the normal cast does.
+-*/
+-inline int roundDoubleToInt (const double value) throw()
+-{
+- union { int asInt[2]; double asDouble; } n;
+- n.asDouble = value + 6755399441055744.0;
+-
+-#if JUCE_BIG_ENDIAN
+- return n.asInt [1];
+-#else
+- return n.asInt [0];
+-#endif
+-}
+-
+-/** Fast floating-point-to-integer conversion.
+-
+- This is faster than using the normal c++ cast to convert a float to an int, and
+- it will round the value to the nearest integer, rather than rounding it down
+- like the normal cast does.
+-*/
+-inline int roundFloatToInt (const float value) throw()
+-{
+- union { int asInt[2]; double asDouble; } n;
+- n.asDouble = value + 6755399441055744.0;
+-
+-#if JUCE_BIG_ENDIAN
+- return n.asInt [1];
+-#else
+- return n.asInt [0];
+-#endif
+-}
+-
+-
+-#endif // __JUCE_DATACONVERSIONS_JUCEHEADER__
++/* ++ ============================================================================== ++ ++ This file is part of the JUCE library - "Jules' Utility Class Extensions" ++ Copyright 2004-6 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. ++ ++ ============================================================================== ++*/ ++ ++#ifndef __JUCE_DATACONVERSIONS_JUCEHEADER__ ++#define __JUCE_DATACONVERSIONS_JUCEHEADER__ ++ ++#include "juce_PlatformDefs.h" ++ ++//============================================================================== ++// Endianness conversions.. ++ ++/** Swaps the byte-order in an integer from little to big-endianness or vice-versa. */ ++inline_assembly uint32 swapByteOrder (uint32 n) throw() ++{ ++#ifdef JUCE_MAC ++ return CFSwapInt32 (n); ++#else ++ #ifdef __GNUC__ ++ #ifndef __x86__ ++ return ( ((n)&0xff)<<24) | (((n)&0xff00)<<8) | (((n)>>8)&0xff00) | (((n)>>24)&0xff); ++ #else ++ // Inpenetrable GCC version.. ++ asm("bswap %%eax" : "=a"(n) : "a"(n)); ++ return n; ++ #endif ++ #else ++ // Win32 version.. ++ __asm { ++ mov eax, n ++ bswap eax ++ mov n, eax ++ } ++ return n; ++ #endif ++#endif ++} ++ ++/** Swaps the byte-order of a 16-bit short. */ ++inline uint16 swapByteOrder (const uint16 n) throw() ++{ ++ return (uint16) ((n << 8) | (n >> 8)); ++} ++ ++inline uint64 swapByteOrder (const uint64 value) throw() ++{ ++#ifdef JUCE_MAC ++ return CFSwapInt64 (value); ++#else ++ return (((int64) swapByteOrder ((uint32) value)) << 32) ++ | swapByteOrder ((uint32) (value >> 32)); ++#endif ++} ++ ++#ifdef JUCE_LITTLE_ENDIAN ++ /** Swaps the byte order of a 16-bit int if the CPU is big-endian */ ++ inline uint16 swapIfBigEndian (const uint16 v) throw() { return v; } ++ /** Swaps the byte order of a 32-bit int if the CPU is big-endian */ ++ inline uint32 swapIfBigEndian (const uint32 v) throw() { return v; } ++ /** Swaps the byte order of a 16-bit int if the CPU is little-endian */ ++ inline uint16 swapIfLittleEndian (const uint16 v) throw() { return swapByteOrder (v); } ++ /** Swaps the byte order of a 32-bit int if the CPU is little-endian */ ++ inline uint32 swapIfLittleEndian (const uint32 v) throw() { return swapByteOrder (v); } ++ ++ /** Turns 4 bytes into a little-endian integer. */ ++ inline uint32 littleEndianInt (const char* const bytes) throw() { return *(uint32*) bytes; } ++ ++ /** Turns 2 bytes into a little-endian integer. */ ++ inline uint16 littleEndianShort (const char* const bytes) throw() { return *(uint16*) bytes; } ++ ++ /** Turns 4 bytes into a big-endian integer. */ ++ inline uint32 bigEndianInt (const char* const bytes) throw() { return swapByteOrder (*(uint32*) bytes); } ++ ++ /** Turns 2 bytes into a big-endian integer. */ ++ inline uint16 bigEndianShort (const char* const bytes) throw() { return swapByteOrder (*(uint16*) bytes); } ++ ++#else ++ /** Swaps the byte order of a 16-bit int if the CPU is big-endian */ ++ inline uint16 swapIfBigEndian (const uint16 v) throw() { return swapByteOrder (v); } ++ /** Swaps the byte order of a 32-bit int if the CPU is big-endian */ ++ inline uint32 swapIfBigEndian (const uint32 v) throw() { return swapByteOrder (v); } ++ /** Swaps the byte order of a 16-bit int if the CPU is little-endian */ ++ inline uint16 swapIfLittleEndian (const uint16 v) throw() { return v; } ++ /** Swaps the byte order of a 32-bit int if the CPU is little-endian */ ++ inline uint32 swapIfLittleEndian (const uint32 v) throw() { return v; } ++ ++ /** Turns 4 bytes into a little-endian integer. */ ++ inline uint32 littleEndianInt (const char* const bytes) throw() { return swapByteOrder (*(uint32*) bytes); } ++ ++ /** Turns 2 bytes into a little-endian integer. */ ++ inline uint16 littleEndianShort (const char* const bytes) throw() { return swapByteOrder (*(uint16*) bytes); } ++ ++ /** Turns 4 bytes into a big-endian integer. */ ++ inline uint32 bigEndianInt (const char* const bytes) throw() { return *(uint32*) bytes; } ++ ++ /** Turns 2 bytes into a big-endian integer. */ ++ inline uint16 bigEndianShort (const char* const bytes) throw() { return *(uint16*) bytes; } ++#endif ++ ++/** Converts 3 little-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ ++inline int littleEndian24Bit (const char* const bytes) throw() { return (((int) bytes[2]) << 16) | (((uint32) (uint8) bytes[1]) << 8) | ((uint32) (uint8) bytes[0]); } ++/** Converts 3 big-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ ++inline int bigEndian24Bit (const char* const bytes) throw() { return (((int) bytes[0]) << 16) | (((uint32) (uint8) bytes[1]) << 8) | ((uint32) (uint8) bytes[2]); } ++ ++/** Copies a 24-bit number to 3 little-endian bytes. */ ++inline void littleEndian24BitToChars (const int value, char* const destBytes) throw() { destBytes[0] = (char)(value & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)((value >> 16) & 0xff); } ++/** Copies a 24-bit number to 3 big-endian bytes. */ ++inline void bigEndian24BitToChars (const int value, char* const destBytes) throw() { destBytes[0] = (char)((value >> 16) & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)(value & 0xff); } ++ ++ ++//============================================================================== ++/** Fast floating-point-to-integer conversion. ++ ++ This is faster than using the normal c++ cast to convert a double to an int, and ++ it will round the value to the nearest integer, rather than rounding it down ++ like the normal cast does. ++*/ ++inline int roundDoubleToInt (const double value) throw() ++{ ++ union { int asInt[2]; double asDouble; } n; ++ n.asDouble = value + 6755399441055744.0; ++ ++#if JUCE_BIG_ENDIAN ++ return n.asInt [1]; ++#else ++ return n.asInt [0]; ++#endif ++} ++ ++/** Fast floating-point-to-integer conversion. ++ ++ This is faster than using the normal c++ cast to convert a float to an int, and ++ it will round the value to the nearest integer, rather than rounding it down ++ like the normal cast does. ++*/ ++inline int roundFloatToInt (const float value) throw() ++{ ++ union { int asInt[2]; double asDouble; } n; ++ n.asDouble = value + 6755399441055744.0; ++ ++#if JUCE_BIG_ENDIAN ++ return n.asInt [1]; ++#else ++ return n.asInt [0]; ++#endif ++} ++ ++ ++#endif // __JUCE_DATACONVERSIONS_JUCEHEADER__ +--- juce/build/linux/platform_specific_code/juce_linux_SystemStats.cpp~remove-x86isms.patch ++++ juce/build/linux/platform_specific_code/juce_linux_SystemStats.cpp +@@ -1,472 +1,472 @@ +-/*
+- ==============================================================================
+-
+- This file is part of the JUCE library - "Jules' Utility Class Extensions"
+- Copyright 2004-6 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"
+-
+-#ifdef __CYGWIN__
+- #include <apr_uuid.h>
+- #include <malloc.h>
+-#else
+- #include <sys/sysinfo.h>
+- #include <dlfcn.h>
+-#endif
+-
+-#ifdef JUCE_UUID
+- #include <uuid/uuid.h>
+-#endif
+-
+-#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/basics/juce_Logger.h"
+-#include "../../../src/juce_core/misc/juce_Uuid.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 struct _LogicalCpuInfo
+-{
+- bool htSupported;
+- bool htAvailable;
+- int numPackages;
+- int numLogicalPerPackage;
+- uint32 physicalAffinityMask;
+-} logicalCpuInfo;
+-
+-//==============================================================================
+-static unsigned int getCPUIDWord (int* familyModel = 0, int* extFeatures = 0) __attribute__ ((noinline));
+-
+-static unsigned int getCPUIDWord (int* familyModel, int* extFeatures)
+-{
+- unsigned int cpu = 0;
+- unsigned int ext = 0;
+- unsigned int family = 0;
+-
+- __asm__ __volatile__ (
+-" pushf \n"
+-#if JUCE_64BIT
+-" pop %%rax \n"
+-#else
+-" pop %%eax \n"
+-#endif
+-" movl %%eax, %%ecx \n"
+-" xorl $0x200000, %%eax \n"
+-#if JUCE_64BIT
+-" push %%rax \n"
+-#else
+-" push %%eax \n"
+-#endif
+-" popf \n"
+-" pushf \n"
+-#if JUCE_64BIT
+-" pop %%rax \n"
+-#else
+-" pop %%eax \n"
+-#endif
+-" andl $0x200000, %%eax \n"
+-" andl $0x200000, %%ecx \n"
+-" cmpl %%eax, %%ecx \n"
+-" movl $0, %%edx \n"
+-" je noCpuId \n"
+-" movl $1, %%eax \n"
+-" cpuid \n"
+-"noCpuId: \n"
+- : "=a"(family), /* Output in eax */
+- "=d"(cpu), /* Output in ebx */
+- "=b"(ext) /* Output in edx */
+- : /* No inputs */
+- : "cc", "ecx" /* Clobber list */
+- );
+-
+- if (familyModel)
+- *familyModel = family;
+- if (extFeatures)
+- *extFeatures = ext;
+-
+- return cpu;
+-}
+-
+-void juce_initLogicalCpuInfo()
+-{
+- int familyModelWord, extFeaturesWord;
+- int featuresWord = getCPUIDWord (&familyModelWord, &extFeaturesWord);
+-
+- logicalCpuInfo.htSupported = false;
+- logicalCpuInfo.htAvailable = false;
+- logicalCpuInfo.numLogicalPerPackage = 1;
+- logicalCpuInfo.numPackages = 0;
+- logicalCpuInfo.physicalAffinityMask = 0;
+-
+-#if SUPPORT_AFFINITIES
+- cpu_set_t processAffinity;
+-
+- /*
+- N.B. If this line causes a compile error, then you've probably not got the latest
+- version of glibc installed.
+-
+- If you don't want to update your copy of glibc and don't care about cpu affinities,
+- then you can just disable all this stuff by removing the SUPPORT_AFFINITIES macro
+- from the linuxincludes.h file.
+- */
+- if (sched_getaffinity (getpid(),
+- sizeof (cpu_set_t),
+- &processAffinity) != sizeof (cpu_set_t))
+- {
+- return;
+- }
+-
+- // Checks: CPUID supported, model >= Pentium 4, Hyperthreading bit set, logical CPUs per package > 1
+- if (featuresWord == 0
+- || ((familyModelWord >> 8) & 0xf) < 15
+- || (featuresWord & (1 << 28)) == 0
+- || ((extFeaturesWord >> 16) & 0xff) < 2)
+- {
+- for (int i = 0; i < 64; ++i)
+- if (CPU_ISSET (i, &processAffinity))
+- logicalCpuInfo.physicalAffinityMask |= (1 << i);
+-
+- return;
+- }
+-
+- logicalCpuInfo.htSupported = true;
+- logicalCpuInfo.numLogicalPerPackage = (extFeaturesWord >> 16) & 0xff;
+-
+- cpu_set_t affinityMask;
+- cpu_set_t physAff;
+- CPU_ZERO (&physAff);
+-
+- unsigned char i = 1;
+- unsigned char physIdMask = 0xFF;
+- unsigned char physIdShift = 0;
+-
+- //unsigned char apicId, logId, physId;
+-
+- while (i < logicalCpuInfo.numLogicalPerPackage)
+- {
+- i *= 2;
+- physIdMask <<= 1;
+- physIdShift++;
+- }
+-
+- CPU_SET (0, &affinityMask);
+- logicalCpuInfo.numPackages = 0;
+-
+-//xxx revisit this at some point..
+-/* while ((affinityMask != 0) && (affinityMask <= processAffinity))
+- {
+- int ret;
+- if (! sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinityMask))
+- {
+- sched_yield(); // schedule onto correct CPU
+-
+- featuresWord = getCPUIDWord(&familyModelWord, &extFeaturesWord);
+- apicId = (unsigned char)(extFeaturesWord >> 24);
+- logId = (unsigned char)(apicId & ~physIdMask);
+- physId = (unsigned char)(apicId >> physIdShift);
+-
+- if (logId != 0)
+- logicalCpuInfo.htAvailable = true;
+-
+- if ((((int)logId) % logicalCpuInfo.numLogicalPerPackage) == 0)
+- {
+- // This is a physical CPU
+- physAff |= affinityMask;
+- logicalCpuInfo.numPackages++;
+- }
+- }
+-
+- affinityMask = affinityMask << 1;
+- }
+-
+- sched_setaffinity (getpid(), sizeof(unsigned long), &processAffinity);
+-*/
+-
+- logicalCpuInfo.physicalAffinityMask = 0;
+-
+- for (int i = 0; i < 64; ++i)
+- if (CPU_ISSET (i, &physAff))
+- logicalCpuInfo.physicalAffinityMask |= (1 << i);
+-
+-#endif
+-}
+-
+-//==============================================================================
+-void Logger::outputDebugString (const String& text)
+-{
+- fprintf (stdout, (const char*) (text + T("\n")));
+-}
+-
+-void Logger::outputDebugPrintf (const tchar* format, ...)
+-{
+- String text;
+- va_list args;
+- va_start (args, format);
+- text.vprintf(format, args);
+- outputDebugString(text);
+-}
+-
+-const String SystemStats::getOSType()
+-{
+- return SystemStats::Linux;
+-}
+-
+-static const String getCpuInfo (const char* key, bool lastOne = false)
+-{
+- 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()
+-{
+- return getCpuInfo ("flags").contains (T("mmx"));
+-}
+-
+-bool SystemStats::hasSSE()
+-{
+- return getCpuInfo ("flags").contains (T("sse"));
+-}
+-
+-bool SystemStats::hasSSE2()
+-{
+- return getCpuInfo ("flags").contains (T("sse2"));
+-}
+-
+-bool SystemStats::has3DNow()
+-{
+- return getCpuInfo ("flags").contains (T("3dnow"));
+-}
+-
+-const String SystemStats::getCpuVendor()
+-{
+- return getCpuInfo ("vendor_id");
+-}
+-
+-int SystemStats::getCpuSpeedInMegaherz()
+-{
+- const String speed (getCpuInfo ("cpu MHz"));
+-
+- return (int) (speed.getFloatValue() + 0.5f);
+-}
+-
+-bool SystemStats::hasHyperThreading()
+-{
+- return logicalCpuInfo.htAvailable;
+-}
+-
+-int SystemStats::getMemorySizeInMegabytes()
+-{
+-#ifndef __CYGWIN__
+- struct sysinfo sysi;
+-
+- if (sysinfo (&sysi) == 0)
+- return (sysi.totalram * sysi.mem_unit / (1024 * 1024));
+-
+- return 0;
+-
+-#else
+- jassertfalse
+- return 256;
+-#endif
+-}
+-
+-unsigned int juce_millisecondsSinceStartup()
+-{
+- static unsigned int calibrate = 0;
+- static bool calibrated = false;
+- timeval t;
+- unsigned int ret = 0;
+-
+- if (! gettimeofday (&t, 0))
+- {
+- if (! calibrated)
+- {
+-#ifndef __CYGWIN__
+- struct sysinfo sysi;
+-
+- if (sysinfo (&sysi) == 0)
+- // Safe to assume system was not brought up earlier than 1970!
+- calibrate = t.tv_sec - sysi.uptime;
+-#else
+- // bit of a hack, but things should all still work, as we're not often
+- // really interested in how long the machine's been turned on, and just
+- // use this call for relative times..
+- calibrate = t.tv_sec;
+-#endif
+-
+- calibrated = true;
+- }
+-
+- ret = 1000 * (t.tv_sec - calibrate) + (t.tv_usec / 1000);
+- }
+-
+- return ret;
+-}
+-
+-double juce_millisecondsSinceStartupHiRes()
+-{
+- return Time::getHighResolutionTicks() * (1.0 / 1000000.0);
+-}
+-
+-int64 Time::getHighResolutionTicks()
+-{
+- timeval t;
+- if (gettimeofday(&t,NULL))
+- return 0;
+-
+- return ((int64) t.tv_sec * (int64) 1000000) + (int64) t.tv_usec;
+-}
+-
+-int64 Time::getHighResolutionTicksPerSecond()
+-{
+- // Microseconds
+- return 1000000;
+-}
+-
+-bool Time::setSystemTimeToThisTime() const
+-{
+- timeval t;
+- t.tv_sec = millisSinceEpoch % 1000000;
+- t.tv_usec = millisSinceEpoch - t.tv_sec;
+-
+- return settimeofday (&t, NULL) ? false : true;
+-}
+-
+-const String Uuid::generateUuid()
+-{
+-#ifdef JUCE_UUID
+- uuid_t uuid;
+- char *s = new char[37];
+- String uuidStr;
+-
+- uuid_generate (uuid);
+- uuid_unparse (uuid, s);
+-
+- uuidStr = s;
+- delete[] s;
+-
+- return uuidStr;
+-#else
+- jassertfalse
+- return String::empty;
+-#endif
+-}
+-
+-int SystemStats::getPageSize()
+-{
+- static int systemPageSize = 0;
+-
+- if (systemPageSize == 0)
+- systemPageSize = sysconf (_SC_PAGESIZE);
+-
+- return systemPageSize;
+-}
+-
+-int SystemStats::getNumPhysicalCpus()
+-{
+- if (logicalCpuInfo.numPackages)
+- return logicalCpuInfo.numPackages;
+-
+- return getNumLogicalCpus();
+-}
+-
+-int SystemStats::getNumLogicalCpus()
+-{
+- const int lastCpu = getCpuInfo ("processor", true).getIntValue();
+-
+- return lastCpu + 1;
+-}
+-
+-uint32 SystemStats::getPhysicalAffinityMask()
+-{
+-#if SUPPORT_AFFINITIES
+- return logicalCpuInfo.physicalAffinityMask;
+-#else
+- /* affinities aren't supported because either the appropriate header files weren't found,
+- or the SUPPORT_AFFINITIES macro was turned off in linuxheaders.h
+- */
+- jassertfalse
+- return 0;
+-#endif
+-
+-}
+-
+-//==============================================================================
+-void SystemStats::initialiseStats()
+-{
+- // Process starts off as root when running suid
+- Process::lowerPrivilege();
+-
+- String s (SystemStats::getJUCEVersion());
+-
+- juce_initLogicalCpuInfo();
+-}
+-
+-void PlatformUtilities::fpuReset()
+-{
+-}
+-
+-END_JUCE_NAMESPACE
++/* ++ ============================================================================== ++ ++ This file is part of the JUCE library - "Jules' Utility Class Extensions" ++ Copyright 2004-6 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" ++ ++#ifdef __CYGWIN__ ++ #include <apr_uuid.h> ++ #include <malloc.h> ++#else ++ #include <sys/sysinfo.h> ++ #include <dlfcn.h> ++#endif ++ ++#ifdef JUCE_UUID ++ #include <uuid/uuid.h> ++#endif ++ ++#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/basics/juce_Logger.h" ++#include "../../../src/juce_core/misc/juce_Uuid.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 struct _LogicalCpuInfo ++{ ++ bool htSupported; ++ bool htAvailable; ++ int numPackages; ++ int numLogicalPerPackage; ++ uint32 physicalAffinityMask; ++} logicalCpuInfo; ++ ++//============================================================================== ++static unsigned int getCPUIDWord (int* familyModel = 0, int* extFeatures = 0) __attribute__ ((noinline)); ++ ++static unsigned int getCPUIDWord (int* familyModel, int* extFeatures) ++{ ++ unsigned int cpu = 0; ++ unsigned int ext = 0; ++ unsigned int family = 0; ++#ifdef __x86__ ++ __asm__ __volatile__ ( ++" pushf \n" ++#if JUCE_64BIT ++" pop %%rax \n" ++#else ++" pop %%eax \n" ++#endif ++" movl %%eax, %%ecx \n" ++" xorl $0x200000, %%eax \n" ++#if JUCE_64BIT ++" push %%rax \n" ++#else ++" push %%eax \n" ++#endif ++" popf \n" ++" pushf \n" ++#if JUCE_64BIT ++" pop %%rax \n" ++#else ++" pop %%eax \n" ++#endif ++" andl $0x200000, %%eax \n" ++" andl $0x200000, %%ecx \n" ++" cmpl %%eax, %%ecx \n" ++" movl $0, %%edx \n" ++" je noCpuId \n" ++" movl $1, %%eax \n" ++" cpuid \n" ++"noCpuId: \n" ++ : "=a"(family), /* Output in eax */ ++ "=d"(cpu), /* Output in ebx */ ++ "=b"(ext) /* Output in edx */ ++ : /* No inputs */ ++ : "cc", "ecx" /* Clobber list */ ++ ); ++#endif ++ if (familyModel) ++ *familyModel = family; ++ if (extFeatures) ++ *extFeatures = ext; ++ ++ return cpu; ++} ++ ++void juce_initLogicalCpuInfo() ++{ ++ int familyModelWord, extFeaturesWord; ++ int featuresWord = getCPUIDWord (&familyModelWord, &extFeaturesWord); ++ ++ logicalCpuInfo.htSupported = false; ++ logicalCpuInfo.htAvailable = false; ++ logicalCpuInfo.numLogicalPerPackage = 1; ++ logicalCpuInfo.numPackages = 0; ++ logicalCpuInfo.physicalAffinityMask = 0; ++ ++#if SUPPORT_AFFINITIES ++ cpu_set_t processAffinity; ++ ++ /* ++ N.B. If this line causes a compile error, then you've probably not got the latest ++ version of glibc installed. ++ ++ If you don't want to update your copy of glibc and don't care about cpu affinities, ++ then you can just disable all this stuff by removing the SUPPORT_AFFINITIES macro ++ from the linuxincludes.h file. ++ */ ++ if (sched_getaffinity (getpid(), ++ sizeof (cpu_set_t), ++ &processAffinity) != sizeof (cpu_set_t)) ++ { ++ return; ++ } ++ ++ // Checks: CPUID supported, model >= Pentium 4, Hyperthreading bit set, logical CPUs per package > 1 ++ if (featuresWord == 0 ++ || ((familyModelWord >> 8) & 0xf) < 15 ++ || (featuresWord & (1 << 28)) == 0 ++ || ((extFeaturesWord >> 16) & 0xff) < 2) ++ { ++ for (int i = 0; i < 64; ++i) ++ if (CPU_ISSET (i, &processAffinity)) ++ logicalCpuInfo.physicalAffinityMask |= (1 << i); ++ ++ return; ++ } ++ ++ logicalCpuInfo.htSupported = true; ++ logicalCpuInfo.numLogicalPerPackage = (extFeaturesWord >> 16) & 0xff; ++ ++ cpu_set_t affinityMask; ++ cpu_set_t physAff; ++ CPU_ZERO (&physAff); ++ ++ unsigned char i = 1; ++ unsigned char physIdMask = 0xFF; ++ unsigned char physIdShift = 0; ++ ++ //unsigned char apicId, logId, physId; ++ ++ while (i < logicalCpuInfo.numLogicalPerPackage) ++ { ++ i *= 2; ++ physIdMask <<= 1; ++ physIdShift++; ++ } ++ ++ CPU_SET (0, &affinityMask); ++ logicalCpuInfo.numPackages = 0; ++ ++//xxx revisit this at some point.. ++/* while ((affinityMask != 0) && (affinityMask <= processAffinity)) ++ { ++ int ret; ++ if (! sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinityMask)) ++ { ++ sched_yield(); // schedule onto correct CPU ++ ++ featuresWord = getCPUIDWord(&familyModelWord, &extFeaturesWord); ++ apicId = (unsigned char)(extFeaturesWord >> 24); ++ logId = (unsigned char)(apicId & ~physIdMask); ++ physId = (unsigned char)(apicId >> physIdShift); ++ ++ if (logId != 0) ++ logicalCpuInfo.htAvailable = true; ++ ++ if ((((int)logId) % logicalCpuInfo.numLogicalPerPackage) == 0) ++ { ++ // This is a physical CPU ++ physAff |= affinityMask; ++ logicalCpuInfo.numPackages++; ++ } ++ } ++ ++ affinityMask = affinityMask << 1; ++ } ++ ++ sched_setaffinity (getpid(), sizeof(unsigned long), &processAffinity); ++*/ ++ ++ logicalCpuInfo.physicalAffinityMask = 0; ++ ++ for (int i = 0; i < 64; ++i) ++ if (CPU_ISSET (i, &physAff)) ++ logicalCpuInfo.physicalAffinityMask |= (1 << i); ++ ++#endif ++} ++ ++//============================================================================== ++void Logger::outputDebugString (const String& text) ++{ ++ fprintf (stdout, (const char*) (text + T("\n"))); ++} ++ ++void Logger::outputDebugPrintf (const tchar* format, ...) ++{ ++ String text; ++ va_list args; ++ va_start (args, format); ++ text.vprintf(format, args); ++ outputDebugString(text); ++} ++ ++const String SystemStats::getOSType() ++{ ++ return SystemStats::Linux; ++} ++ ++static const String getCpuInfo (const char* key, bool lastOne = false) ++{ ++ 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() ++{ ++ return getCpuInfo ("flags").contains (T("mmx")); ++} ++ ++bool SystemStats::hasSSE() ++{ ++ return getCpuInfo ("flags").contains (T("sse")); ++} ++ ++bool SystemStats::hasSSE2() ++{ ++ return getCpuInfo ("flags").contains (T("sse2")); ++} ++ ++bool SystemStats::has3DNow() ++{ ++ return getCpuInfo ("flags").contains (T("3dnow")); ++} ++ ++const String SystemStats::getCpuVendor() ++{ ++ return getCpuInfo ("vendor_id"); ++} ++ ++int SystemStats::getCpuSpeedInMegaherz() ++{ ++ const String speed (getCpuInfo ("cpu MHz")); ++ ++ return (int) (speed.getFloatValue() + 0.5f); ++} ++ ++bool SystemStats::hasHyperThreading() ++{ ++ return logicalCpuInfo.htAvailable; ++} ++ ++int SystemStats::getMemorySizeInMegabytes() ++{ ++#ifndef __CYGWIN__ ++ struct sysinfo sysi; ++ ++ if (sysinfo (&sysi) == 0) ++ return (sysi.totalram * sysi.mem_unit / (1024 * 1024)); ++ ++ return 0; ++ ++#else ++ jassertfalse ++ return 256; ++#endif ++} ++ ++unsigned int juce_millisecondsSinceStartup() ++{ ++ static unsigned int calibrate = 0; ++ static bool calibrated = false; ++ timeval t; ++ unsigned int ret = 0; ++ ++ if (! gettimeofday (&t, 0)) ++ { ++ if (! calibrated) ++ { ++#ifndef __CYGWIN__ ++ struct sysinfo sysi; ++ ++ if (sysinfo (&sysi) == 0) ++ // Safe to assume system was not brought up earlier than 1970! ++ calibrate = t.tv_sec - sysi.uptime; ++#else ++ // bit of a hack, but things should all still work, as we're not often ++ // really interested in how long the machine's been turned on, and just ++ // use this call for relative times.. ++ calibrate = t.tv_sec; ++#endif ++ ++ calibrated = true; ++ } ++ ++ ret = 1000 * (t.tv_sec - calibrate) + (t.tv_usec / 1000); ++ } ++ ++ return ret; ++} ++ ++double juce_millisecondsSinceStartupHiRes() ++{ ++ return Time::getHighResolutionTicks() * (1.0 / 1000000.0); ++} ++ ++int64 Time::getHighResolutionTicks() ++{ ++ timeval t; ++ if (gettimeofday(&t,NULL)) ++ return 0; ++ ++ return ((int64) t.tv_sec * (int64) 1000000) + (int64) t.tv_usec; ++} ++ ++int64 Time::getHighResolutionTicksPerSecond() ++{ ++ // Microseconds ++ return 1000000; ++} ++ ++bool Time::setSystemTimeToThisTime() const ++{ ++ timeval t; ++ t.tv_sec = millisSinceEpoch % 1000000; ++ t.tv_usec = millisSinceEpoch - t.tv_sec; ++ ++ return settimeofday (&t, NULL) ? false : true; ++} ++ ++const String Uuid::generateUuid() ++{ ++#ifdef JUCE_UUID ++ uuid_t uuid; ++ char *s = new char[37]; ++ String uuidStr; ++ ++ uuid_generate (uuid); ++ uuid_unparse (uuid, s); ++ ++ uuidStr = s; ++ delete[] s; ++ ++ return uuidStr; ++#else ++ jassertfalse ++ return String::empty; ++#endif ++} ++ ++int SystemStats::getPageSize() ++{ ++ static int systemPageSize = 0; ++ ++ if (systemPageSize == 0) ++ systemPageSize = sysconf (_SC_PAGESIZE); ++ ++ return systemPageSize; ++} ++ ++int SystemStats::getNumPhysicalCpus() ++{ ++ if (logicalCpuInfo.numPackages) ++ return logicalCpuInfo.numPackages; ++ ++ return getNumLogicalCpus(); ++} ++ ++int SystemStats::getNumLogicalCpus() ++{ ++ const int lastCpu = getCpuInfo ("processor", true).getIntValue(); ++ ++ return lastCpu + 1; ++} ++ ++uint32 SystemStats::getPhysicalAffinityMask() ++{ ++#if SUPPORT_AFFINITIES ++ return logicalCpuInfo.physicalAffinityMask; ++#else ++ /* affinities aren't supported because either the appropriate header files weren't found, ++ or the SUPPORT_AFFINITIES macro was turned off in linuxheaders.h ++ */ ++ jassertfalse ++ return 0; ++#endif ++ ++} ++ ++//============================================================================== ++void SystemStats::initialiseStats() ++{ ++ // Process starts off as root when running suid ++ Process::lowerPrivilege(); ++ ++ String s (SystemStats::getJUCEVersion()); ++ ++ juce_initLogicalCpuInfo(); ++} ++ ++void PlatformUtilities::fpuReset() ++{ ++} ++ ++END_JUCE_NAMESPACE |