From 73210e73dc2a7ffceb098e5e2b28ad222f9115ea Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Thu, 25 Mar 2010 18:05:41 +0000 Subject: [PATCH] Added Intel compiler support for atomics. Small Jucer fix for file browsing. --- .../Source/ui/jucer_ProjectTreeViewBase.cpp | 3 +- .../Source/InternalFilters.h | 2 +- juce_amalgamated.h | 107 +++++++++++------- src/core/juce_Atomic.h | 103 ++++++++++------- src/core/juce_StandardHeader.h | 8 ++ 5 files changed, 139 insertions(+), 84 deletions(-) diff --git a/extras/Jucer (experimental)/Source/ui/jucer_ProjectTreeViewBase.cpp b/extras/Jucer (experimental)/Source/ui/jucer_ProjectTreeViewBase.cpp index 21600eba47..ee08fcceb8 100644 --- a/extras/Jucer (experimental)/Source/ui/jucer_ProjectTreeViewBase.cpp +++ b/extras/Jucer (experimental)/Source/ui/jucer_ProjectTreeViewBase.cpp @@ -62,7 +62,8 @@ const File ProjectTreeViewBase::getFile() const void ProjectTreeViewBase::browseToAddExistingFiles() { - FileChooser fc ("Add Files to Jucer Project", getFile(), String::empty, false); + const File location (item.isGroup() ? item.determineGroupFolder() : getFile()); + FileChooser fc ("Add Files to Jucer Project", location, String::empty, false); if (fc.browseForMultipleFilesOrDirectories()) { diff --git a/extras/audio plugin host/Source/InternalFilters.h b/extras/audio plugin host/Source/InternalFilters.h index 4ee690af79..de317edc52 100644 --- a/extras/audio plugin host/Source/InternalFilters.h +++ b/extras/audio plugin host/Source/InternalFilters.h @@ -61,7 +61,7 @@ public: void findAllTypesForFile (OwnedArray &, const String&) {} bool doesPluginStillExist (const PluginDescription&) { return true; } const String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) { return fileOrIdentifier; } - const StringArray searchPathsForPlugins (const FileSearchPath&, const bool) { return StringArray(); } + const StringArray searchPathsForPlugins (const FileSearchPath&, bool) { return StringArray(); } AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc); //============================================================================== diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 33586aaf01..1255427895 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -526,6 +526,14 @@ #if JUCE_LINUX #include + + #if __INTEL_COMPILER + #if __ia64__ + #include + #else + #include + #endif + #endif #endif #if JUCE_MSVC && JUCE_DEBUG @@ -3089,53 +3097,72 @@ private: #if (JUCE_MAC || JUCE_IPHONE) // Mac and iPhone... -inline void Atomic::increment (int32& variable) { OSAtomicIncrement32 ((int32_t*) &variable); } -inline int32 Atomic::incrementAndReturn (int32& variable) { return OSAtomicIncrement32 ((int32_t*) &variable); } -inline void Atomic::decrement (int32& variable) { OSAtomicDecrement32 ((int32_t*) &variable); } -inline int32 Atomic::decrementAndReturn (int32& variable) { return OSAtomicDecrement32 ((int32_t*) &variable); } -inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) - { return OSAtomicCompareAndSwap32Barrier (oldValue, newValue, (int32_t*) &destination); } -inline void* Atomic::swapPointers (void* volatile* value1, void* value2) -{ - void* currentVal = *value1; -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 && ! JUCE_64BIT - while (! OSAtomicCompareAndSwap32 ((int32_t) currentVal, (int32_t) value2, (int32_t*) value1)) { currentVal = *value1; } -#else - while (! OSAtomicCompareAndSwapPtr (currentVal, value2, value1)) { currentVal = *value1; } -#endif - return currentVal; -} + inline void Atomic::increment (int32& variable) { OSAtomicIncrement32 (static_cast (&variable)); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return OSAtomicIncrement32 (static_cast (&variable)); } + inline void Atomic::decrement (int32& variable) { OSAtomicDecrement32 (static_cast (&variable)); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return OSAtomicDecrement32 (static_cast (&variable)); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return OSAtomicCompareAndSwap32Barrier (oldValue, newValue, static_cast (&destination)); } + inline void* Atomic::swapPointers (void* volatile* value1, void* value2) + { + void* currentVal = *value1; + #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 && ! JUCE_64BIT + while (! OSAtomicCompareAndSwap32 (reinterpret_cast (currentVal), reinterpret_cast (value2), + reinterpret_cast (value1))) { currentVal = *value1; } + #else + while (! OSAtomicCompareAndSwapPtr (currentVal, value2, value1)) { currentVal = *value1; } + #endif + return currentVal; + } #elif JUCE_LINUX // Linux... -inline void Atomic::increment (int32& variable) { __sync_add_and_fetch (&variable, 1); } -inline int32 Atomic::incrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, 1); } -inline void Atomic::decrement (int32& variable) { __sync_add_and_fetch (&variable, -1); } -inline int32 Atomic::decrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, -1); } -inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) - { return __sync_val_compare_and_swap (&destination, oldValue, newValue); } -inline void* Atomic::swapPointers (void* volatile* value1, void* value2) -{ - void* currentVal = *value1; - while (! __sync_bool_compare_and_swap (value1, currentVal, value2)) { currentVal = *value1; } - return currentVal; -} + #if __INTEL_COMPILER + inline void Atomic::increment (int32& variable) { _InterlockedIncrement (static_cast (&variable)); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return _InterlockedIncrement (static_cast (&variable)); } + inline void Atomic::decrement (int32& variable) { _InterlockedDecrement (static_cast (&variable)); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return _InterlockedDecrement (static_cast (&variable)); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return _InterlockedCompareExchange (static_cast (&destination), newValue, oldValue); } + + inline void* Atomic::swapPointers (void* volatile* value1, void* value2) + { + #if __ia64__ + return reinterpret_cast (_InterlockedExchange64 (reinterpret_cast (value1), reinterpret_cast<__int64> (value2))); + #else + return reinterpret_cast (_InterlockedExchange (reinterpret_cast (value1), reinterpret_cast (value2))); + #endif + } + + #else + inline void Atomic::increment (int32& variable) { __sync_add_and_fetch (&variable, 1); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, 1); } + inline void Atomic::decrement (int32& variable) { __sync_add_and_fetch (&variable, -1); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, -1); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return __sync_val_compare_and_swap (&destination, oldValue, newValue); } + + inline void* Atomic::swapPointers (void* volatile* value1, void* value2) + { + void* currentVal = *value1; + while (! __sync_bool_compare_and_swap (value1, currentVal, value2)) { currentVal = *value1; } + return currentVal; + } + #endif #elif JUCE_USE_INTRINSICS // Windows... -// (If JUCE_USE_INTRINSICS isn't enabled, a fallback version of these methods is -// declared in juce_win32_Threads.cpp) -#pragma intrinsic (_InterlockedIncrement) -#pragma intrinsic (_InterlockedDecrement) -#pragma intrinsic (_InterlockedCompareExchange) - -inline void Atomic::increment (int32& variable) { _InterlockedIncrement (reinterpret_cast (&variable)); } -inline int32 Atomic::incrementAndReturn (int32& variable) { return _InterlockedIncrement (reinterpret_cast (&variable)); } -inline void Atomic::decrement (int32& variable) { _InterlockedDecrement (reinterpret_cast (&variable)); } -inline int32 Atomic::decrementAndReturn (int32& variable) { return _InterlockedDecrement (reinterpret_cast (&variable)); } -inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) - { return _InterlockedCompareExchange (reinterpret_cast (&destination), newValue, oldValue); } + // (If JUCE_USE_INTRINSICS isn't enabled, a fallback version of these methods is declared in juce_win32_Threads.cpp) + #pragma intrinsic (_InterlockedIncrement) + #pragma intrinsic (_InterlockedDecrement) + #pragma intrinsic (_InterlockedCompareExchange) + inline void Atomic::increment (int32& variable) { _InterlockedIncrement (reinterpret_cast (&variable)); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return _InterlockedIncrement (reinterpret_cast (&variable)); } + inline void Atomic::decrement (int32& variable) { _InterlockedDecrement (reinterpret_cast (&variable)); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return _InterlockedDecrement (reinterpret_cast (&variable)); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return _InterlockedCompareExchange (reinterpret_cast (&destination), newValue, oldValue); } #endif #endif // __JUCE_ATOMIC_JUCEHEADER__ diff --git a/src/core/juce_Atomic.h b/src/core/juce_Atomic.h index 5a1e41e410..7be8bd17f7 100644 --- a/src/core/juce_Atomic.h +++ b/src/core/juce_Atomic.h @@ -64,55 +64,74 @@ private: //============================================================================== #if (JUCE_MAC || JUCE_IPHONE) // Mac and iPhone... -inline void Atomic::increment (int32& variable) { OSAtomicIncrement32 ((int32_t*) &variable); } -inline int32 Atomic::incrementAndReturn (int32& variable) { return OSAtomicIncrement32 ((int32_t*) &variable); } -inline void Atomic::decrement (int32& variable) { OSAtomicDecrement32 ((int32_t*) &variable); } -inline int32 Atomic::decrementAndReturn (int32& variable) { return OSAtomicDecrement32 ((int32_t*) &variable); } -inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) - { return OSAtomicCompareAndSwap32Barrier (oldValue, newValue, (int32_t*) &destination); } -inline void* Atomic::swapPointers (void* volatile* value1, void* value2) -{ - void* currentVal = *value1; -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 && ! JUCE_64BIT - while (! OSAtomicCompareAndSwap32 ((int32_t) currentVal, (int32_t) value2, (int32_t*) value1)) { currentVal = *value1; } -#else - while (! OSAtomicCompareAndSwapPtr (currentVal, value2, value1)) { currentVal = *value1; } -#endif - return currentVal; -} - -#elif JUCE_LINUX // Linux... + inline void Atomic::increment (int32& variable) { OSAtomicIncrement32 (static_cast (&variable)); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return OSAtomicIncrement32 (static_cast (&variable)); } + inline void Atomic::decrement (int32& variable) { OSAtomicDecrement32 (static_cast (&variable)); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return OSAtomicDecrement32 (static_cast (&variable)); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return OSAtomicCompareAndSwap32Barrier (oldValue, newValue, static_cast (&destination)); } + inline void* Atomic::swapPointers (void* volatile* value1, void* value2) + { + void* currentVal = *value1; + #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 && ! JUCE_64BIT + while (! OSAtomicCompareAndSwap32 (reinterpret_cast (currentVal), reinterpret_cast (value2), + reinterpret_cast (value1))) { currentVal = *value1; } + #else + while (! OSAtomicCompareAndSwapPtr (currentVal, value2, value1)) { currentVal = *value1; } + #endif + return currentVal; + } //============================================================================== -inline void Atomic::increment (int32& variable) { __sync_add_and_fetch (&variable, 1); } -inline int32 Atomic::incrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, 1); } -inline void Atomic::decrement (int32& variable) { __sync_add_and_fetch (&variable, -1); } -inline int32 Atomic::decrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, -1); } -inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) - { return __sync_val_compare_and_swap (&destination, oldValue, newValue); } -inline void* Atomic::swapPointers (void* volatile* value1, void* value2) -{ - void* currentVal = *value1; - while (! __sync_bool_compare_and_swap (value1, currentVal, value2)) { currentVal = *value1; } - return currentVal; -} +#elif JUCE_LINUX // Linux... + + #if __INTEL_COMPILER + inline void Atomic::increment (int32& variable) { _InterlockedIncrement (static_cast (&variable)); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return _InterlockedIncrement (static_cast (&variable)); } + inline void Atomic::decrement (int32& variable) { _InterlockedDecrement (static_cast (&variable)); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return _InterlockedDecrement (static_cast (&variable)); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return _InterlockedCompareExchange (static_cast (&destination), newValue, oldValue); } + + inline void* Atomic::swapPointers (void* volatile* value1, void* value2) + { + #if __ia64__ + return reinterpret_cast (_InterlockedExchange64 (reinterpret_cast (value1), reinterpret_cast<__int64> (value2))); + #else + return reinterpret_cast (_InterlockedExchange (reinterpret_cast (value1), reinterpret_cast (value2))); + #endif + } + + #else + inline void Atomic::increment (int32& variable) { __sync_add_and_fetch (&variable, 1); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, 1); } + inline void Atomic::decrement (int32& variable) { __sync_add_and_fetch (&variable, -1); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return __sync_add_and_fetch (&variable, -1); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return __sync_val_compare_and_swap (&destination, oldValue, newValue); } + + inline void* Atomic::swapPointers (void* volatile* value1, void* value2) + { + void* currentVal = *value1; + while (! __sync_bool_compare_and_swap (value1, currentVal, value2)) { currentVal = *value1; } + return currentVal; + } + #endif //============================================================================== #elif JUCE_USE_INTRINSICS // Windows... -// (If JUCE_USE_INTRINSICS isn't enabled, a fallback version of these methods is -// declared in juce_win32_Threads.cpp) -#pragma intrinsic (_InterlockedIncrement) -#pragma intrinsic (_InterlockedDecrement) -#pragma intrinsic (_InterlockedCompareExchange) - -inline void Atomic::increment (int32& variable) { _InterlockedIncrement (reinterpret_cast (&variable)); } -inline int32 Atomic::incrementAndReturn (int32& variable) { return _InterlockedIncrement (reinterpret_cast (&variable)); } -inline void Atomic::decrement (int32& variable) { _InterlockedDecrement (reinterpret_cast (&variable)); } -inline int32 Atomic::decrementAndReturn (int32& variable) { return _InterlockedDecrement (reinterpret_cast (&variable)); } -inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) - { return _InterlockedCompareExchange (reinterpret_cast (&destination), newValue, oldValue); } + // (If JUCE_USE_INTRINSICS isn't enabled, a fallback version of these methods is declared in juce_win32_Threads.cpp) + #pragma intrinsic (_InterlockedIncrement) + #pragma intrinsic (_InterlockedDecrement) + #pragma intrinsic (_InterlockedCompareExchange) + inline void Atomic::increment (int32& variable) { _InterlockedIncrement (reinterpret_cast (&variable)); } + inline int32 Atomic::incrementAndReturn (int32& variable) { return _InterlockedIncrement (reinterpret_cast (&variable)); } + inline void Atomic::decrement (int32& variable) { _InterlockedDecrement (reinterpret_cast (&variable)); } + inline int32 Atomic::decrementAndReturn (int32& variable) { return _InterlockedDecrement (reinterpret_cast (&variable)); } + inline int32 Atomic::compareAndExchange (int32& destination, int32 newValue, int32 oldValue) + { return _InterlockedCompareExchange (reinterpret_cast (&destination), newValue, oldValue); } #endif #endif // __JUCE_ATOMIC_JUCEHEADER__ diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h index 121f6d27d8..c2b45fe692 100644 --- a/src/core/juce_StandardHeader.h +++ b/src/core/juce_StandardHeader.h @@ -95,6 +95,14 @@ #if JUCE_LINUX #include + + #if __INTEL_COMPILER + #if __ia64__ + #include + #else + #include + #endif + #endif #endif #if JUCE_MSVC && JUCE_DEBUG