From ee7778918055b7fc6bf3c7ffb6d70cbc47b088cb Mon Sep 17 00:00:00 2001 From: Paul Wisbey Date: Wed, 18 Nov 2015 11:16:03 +0000 Subject: [PATCH] Guard against GestureEventProcessor access after Core destruction Change-Id: Ie7222a335e455c4bc8e10534c214995bf05c8bc3 --- dali/internal/event/events/gesture-detector-impl.cpp | 20 ++++++++++++++++---- .../event/events/long-press-gesture-processor.cpp | 19 +++++++++++-------- dali/internal/event/events/pan-gesture-processor.cpp | 19 +++++++++++-------- dali/internal/event/events/tap-gesture-processor.cpp | 19 +++++++++++-------- 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/dali/internal/event/events/gesture-detector-impl.cpp b/dali/internal/event/events/gesture-detector-impl.cpp index b3ef831..58e4816 100644 --- a/dali/internal/event/events/gesture-detector-impl.cpp +++ b/dali/internal/event/events/gesture-detector-impl.cpp @@ -106,7 +106,11 @@ void GestureDetector::Detach(Actor& actor) // Unregister from gesture event processor if we do not have any actors if ( mAttachedActors.empty() ) { - mGestureEventProcessor.RemoveGestureDetector(this); + // Guard to allow handle destruction after Core has been destroyed + if( Stage::IsInstalled() ) + { + mGestureEventProcessor.RemoveGestureDetector(this); + } } } } @@ -135,8 +139,12 @@ void GestureDetector::DetachAll() OnActorDetach(*actor); } - // Unregister from gesture event processor - mGestureEventProcessor.RemoveGestureDetector(this); + // Guard to allow handle destruction after Core has been destroyed + if ( Stage::IsInstalled() ) + { + // Unregister from gesture event processor + mGestureEventProcessor.RemoveGestureDetector(this); + } } } @@ -178,7 +186,11 @@ void GestureDetector::ObjectDestroyed(Object& object) // Unregister from gesture event processor if we do not have any actors if ( mAttachedActors.empty() ) { - mGestureEventProcessor.RemoveGestureDetector(this); + // Guard to allow handle destruction after Core has been destroyed + if ( Stage::IsInstalled() ) + { + mGestureEventProcessor.RemoveGestureDetector(this); + } } } } diff --git a/dali/internal/event/events/long-press-gesture-processor.cpp b/dali/internal/event/events/long-press-gesture-processor.cpp index 6fc846a..f5aecee 100644 --- a/dali/internal/event/events/long-press-gesture-processor.cpp +++ b/dali/internal/event/events/long-press-gesture-processor.cpp @@ -270,16 +270,19 @@ void LongPressGestureProcessor::UpdateDetection() { LongPressGestureDetector* current(*iter); - unsigned int minimum = current->GetMinimumTouchesRequired(); - if (minimum < minimumRequired) + if( current ) { - minimumRequired = minimum; - } + unsigned int minimum = current->GetMinimumTouchesRequired(); + if (minimum < minimumRequired) + { + minimumRequired = minimum; + } - unsigned int maximum = current->GetMaximumTouchesRequired(); - if ( maximum > maximumRequired ) - { - maximumRequired = maximum; + unsigned int maximum = current->GetMaximumTouchesRequired(); + if ( maximum > maximumRequired ) + { + maximumRequired = maximum; + } } } diff --git a/dali/internal/event/events/pan-gesture-processor.cpp b/dali/internal/event/events/pan-gesture-processor.cpp index e3cbcc2..edb2abd 100644 --- a/dali/internal/event/events/pan-gesture-processor.cpp +++ b/dali/internal/event/events/pan-gesture-processor.cpp @@ -373,16 +373,19 @@ void PanGestureProcessor::UpdateDetection() { PanGestureDetector* detector(*iter); - unsigned int minimum = detector->GetMinimumTouchesRequired(); - if (minimum < minimumRequired) + if( detector ) { - minimumRequired = minimum; - } + unsigned int minimum = detector->GetMinimumTouchesRequired(); + if (minimum < minimumRequired) + { + minimumRequired = minimum; + } - unsigned int maximum = detector->GetMaximumTouchesRequired(); - if (maximum > maximumRequired) - { - maximumRequired = maximum; + unsigned int maximum = detector->GetMaximumTouchesRequired(); + if (maximum > maximumRequired) + { + maximumRequired = maximum; + } } } diff --git a/dali/internal/event/events/tap-gesture-processor.cpp b/dali/internal/event/events/tap-gesture-processor.cpp index 2814208..4cdb920 100644 --- a/dali/internal/event/events/tap-gesture-processor.cpp +++ b/dali/internal/event/events/tap-gesture-processor.cpp @@ -253,14 +253,17 @@ void TapGestureProcessor::UpdateDetection() { TapGestureDetector* detector(*iter); - const unsigned int minTapsRequired = detector->GetMinimumTapsRequired(); - const unsigned int maxTapsRequired = detector->GetMaximumTapsRequired(); - const unsigned int touchesRequired = detector->GetTouchesRequired(); - - minTaps = minTapsRequired < minTaps ? minTapsRequired : minTaps; - maxTaps = maxTapsRequired > maxTaps ? maxTapsRequired : maxTaps; - minTouches = touchesRequired < minTouches ? touchesRequired : minTouches; - maxTouches = touchesRequired > maxTouches ? touchesRequired : maxTouches; + if( detector ) + { + const unsigned int minTapsRequired = detector->GetMinimumTapsRequired(); + const unsigned int maxTapsRequired = detector->GetMaximumTapsRequired(); + const unsigned int touchesRequired = detector->GetTouchesRequired(); + + minTaps = minTapsRequired < minTaps ? minTapsRequired : minTaps; + maxTaps = maxTapsRequired > maxTaps ? maxTapsRequired : maxTaps; + minTouches = touchesRequired < minTouches ? touchesRequired : minTouches; + maxTouches = touchesRequired > maxTouches ? touchesRequired : maxTouches; + } } if ( (minTaps != mMinTapsRequired)||(maxTaps != mMaxTapsRequired) || -- 2.7.4