From 59669e8beca14ee976be3d17584c933fee04f614 Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 27 Mar 2012 11:04:27 +0100 Subject: [PATCH] Thread-local value fix for plugins on XP. Android startup tweaks. Minor component changes. --- .../native/juce_android_JNIHelpers.h | 5 ++++ .../native/juce_android_SystemStats.cpp | 28 +++++++++++++++++++ .../juce_core/threads/juce_ThreadLocalValue.h | 6 ++-- .../broadcasters/juce_ChangeBroadcaster.cpp | 5 ---- .../messages/juce_MessageManager.cpp | 6 ++-- .../components/juce_Component.cpp | 6 +++- .../layout/juce_ComponentMovementWatcher.h | 3 ++ .../native/juce_mac_NSViewComponent.mm | 7 ++--- .../juce_opengl/opengl/juce_OpenGLHelpers.cpp | 1 + 9 files changed, 51 insertions(+), 16 deletions(-) diff --git a/modules/juce_core/native/juce_android_JNIHelpers.h b/modules/juce_core/native/juce_android_JNIHelpers.h index c9af6c52cd..12b210fb71 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.h +++ b/modules/juce_core/native/juce_android_JNIHelpers.h @@ -258,6 +258,11 @@ public: void initialise (JNIEnv* env) { + // NB: the DLL can be left loaded by the JVM, so the same static + // objects can end up being reused by subsequent runs of the app + zeromem (threads, sizeof (threads)); + zeromem (envs, sizeof (envs)); + env->GetJavaVM (&jvm); addEnv (env); } diff --git a/modules/juce_core/native/juce_android_SystemStats.cpp b/modules/juce_core/native/juce_android_SystemStats.cpp index 50fbfb5044..b64064a5ee 100644 --- a/modules/juce_core/native/juce_android_SystemStats.cpp +++ b/modules/juce_core/native/juce_android_SystemStats.cpp @@ -98,11 +98,29 @@ jfieldID JNIClassBase::resolveStaticField (JNIEnv* env, const char* fieldName, c //============================================================================== ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; +#if JUCE_DEBUG +static bool systemInitialised = false; +#endif + JNIEnv* getEnv() noexcept { + #if JUCE_DEBUG + if (! systemInitialised) + { + DBG ("*** Call to getEnv() when system not initialised"); + jassertfalse; + exit (0); + } + #endif + return threadLocalJNIEnvHolder.getOrAttach(); } +extern "C" jint JNI_OnLoad (JavaVM*, void*) +{ + return JNI_VERSION_1_2; +} + //============================================================================== AndroidSystem::AndroidSystem() : screenWidth (0), screenHeight (0) { @@ -111,9 +129,14 @@ AndroidSystem::AndroidSystem() : screenWidth (0), screenHeight (0) void AndroidSystem::initialise (JNIEnv* env, jobject activity_, jstring appFile_, jstring appDataDir_) { + screenWidth = screenHeight = 0; JNIClassBase::initialiseAllClasses (env); threadLocalJNIEnvHolder.initialise (env); + #if JUCE_DEBUG + systemInitialised = true; + #endif + activity = GlobalRef (activity_); appFile = juceString (env, appFile_); appDataDir = juceString (env, appDataDir_); @@ -122,6 +145,11 @@ void AndroidSystem::initialise (JNIEnv* env, jobject activity_, void AndroidSystem::shutdown (JNIEnv* env) { activity.clear(); + + #if JUCE_DEBUG + systemInitialised = false; + #endif + JNIClassBase::releaseAllClasses (env); } diff --git a/modules/juce_core/threads/juce_ThreadLocalValue.h b/modules/juce_core/threads/juce_ThreadLocalValue.h index dfd0fafb54..7009d9e80e 100644 --- a/modules/juce_core/threads/juce_ThreadLocalValue.h +++ b/modules/juce_core/threads/juce_ThreadLocalValue.h @@ -26,8 +26,10 @@ #ifndef __JUCE_THREADLOCALVALUE_JUCEHEADER__ #define __JUCE_THREADLOCALVALUE_JUCEHEADER__ -#if ! (JUCE_MSVC || (JUCE_MAC && defined (__clang__) && defined (MAC_OS_X_VERSION_10_7) \ - && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7)) +// (NB: on win32, native thread-locals aren't possible in a dynamically loaded DLL in XP). +#if ! ((JUCE_MSVC && (defined (_WIN64) || ! defined (JucePlugin_PluginCode))) \ + || (JUCE_MAC && defined (__clang__) && defined (MAC_OS_X_VERSION_10_7) \ + && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7)) #define JUCE_NO_COMPILER_THREAD_LOCAL 1 #endif diff --git a/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp b/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp index 90c3baf20a..7c9a8db8ad 100644 --- a/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp +++ b/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp @@ -25,16 +25,11 @@ ChangeBroadcaster::ChangeBroadcaster() noexcept { - // are you trying to create this object before or after juce has been intialised?? - jassert (MessageManager::getInstanceWithoutCreating() != nullptr); - callback.owner = this; } ChangeBroadcaster::~ChangeBroadcaster() { - // all event-based objects must be deleted BEFORE juce is shut down! - jassert (MessageManager::getInstanceWithoutCreating() != nullptr); } void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index 77dac7363c..9b50f2e7cd 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -35,8 +35,7 @@ public: mm->quitMessageReceived = true; } -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QuitMessage); + JUCE_DECLARE_NON_COPYABLE (QuitMessage); }; //============================================================================== @@ -239,8 +238,7 @@ public: WaitableEvent lockedEvent, releaseEvent; -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BlockingMessage); + JUCE_DECLARE_NON_COPYABLE (BlockingMessage); }; //============================================================================== diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index 7304f8a424..94cfe3479d 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -750,7 +750,11 @@ private: void Component::setCachedComponentImage (CachedComponentImage* newCachedImage) { - cachedImage = newCachedImage; + if (cachedImage != newCachedImage) + { + cachedImage = newCachedImage; + repaint(); + } } void Component::setBufferedToImage (const bool shouldBeBuffered) diff --git a/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h b/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h index 463c0856e2..c037a8d898 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h +++ b/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h @@ -67,6 +67,9 @@ public: */ virtual void componentVisibilityChanged() = 0; + /** Returns the component that's being watched. */ + Component* getComponent() const noexcept { return component; } + //============================================================================== /** @internal */ void componentParentHierarchyChanged (Component& component); diff --git a/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm b/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm index 6824265fc5..849dafcab9 100644 --- a/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm +++ b/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm @@ -63,11 +63,10 @@ public: if (topComp->getPeer() != nullptr) { - const Point pos (topComp->getLocalPoint (&owner, Point())); + const Rectangle area (topComp->getLocalArea (&owner, owner.getLocalBounds())); - NSRect r = NSMakeRect ((float) pos.getX(), (float) pos.getY(), (float) owner.getWidth(), (float) owner.getHeight()); + NSRect r = NSMakeRect ((float) area.getX(), (float) area.getY(), (float) area.getWidth(), (float) area.getHeight()); r.origin.y = [[view superview] frame].size.height - (r.origin.y + r.size.height); - [view setFrame: r]; } } @@ -83,7 +82,7 @@ public: if (peer != nullptr) { - NSView* peerView = (NSView*) peer->getNativeHandle(); + NSView* const peerView = (NSView*) peer->getNativeHandle(); [peerView addSubview: view]; componentMovedOrResized (false, false); } diff --git a/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp b/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp index 77e641b646..e17d218d8a 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp @@ -189,6 +189,7 @@ void OpenGLHelpers::drawTriangleStrip (const GLfloat* const vertices, const GLfl { #if ! JUCE_ANDROID glEnable (GL_TEXTURE_2D); + clearGLError(); #endif glDisableClientState (GL_COLOR_ARRAY); glDisableClientState (GL_NORMAL_ARRAY);