Guard against GestureEventProcessor access after Core destruction 40/52040/3
authorPaul Wisbey <p.wisbey@samsung.com>
Wed, 18 Nov 2015 11:16:03 +0000 (11:16 +0000)
committerPaul Wisbey <p.wisbey@samsung.com>
Wed, 18 Nov 2015 17:12:33 +0000 (09:12 -0800)
Change-Id: Ie7222a335e455c4bc8e10534c214995bf05c8bc3

dali/internal/event/events/gesture-detector-impl.cpp
dali/internal/event/events/long-press-gesture-processor.cpp
dali/internal/event/events/pan-gesture-processor.cpp
dali/internal/event/events/tap-gesture-processor.cpp

index b3ef831..58e4816 100644 (file)
@@ -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);
+        }
       }
     }
   }
index 6fc846a..f5aecee 100644 (file)
@@ -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;
+      }
     }
   }
 
index e3cbcc2..edb2abd 100644 (file)
@@ -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;
+      }
     }
   }
 
index 2814208..4cdb920 100644 (file)
@@ -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) ||