[Tizen] Fix the crash when adding new scene during core event processing 93/208493/1 accepted/tizen/unified/20190626.040901 submit/tizen/20190625.070138
authorRichard Huang <r.huang@samsung.com>
Fri, 21 Jun 2019 13:14:16 +0000 (14:14 +0100)
committerHeeyong Song <heeyong.song@samsung.com>
Tue, 25 Jun 2019 06:50:09 +0000 (15:50 +0900)
Change-Id: I6ed13af6305a3615f0c874a2112cb132d894d56d

dali/internal/common/core-impl.cpp

index c1e7fde..0e5c110 100644 (file)
@@ -268,8 +268,12 @@ void Core::ProcessEvents()
   // Signal that any messages received will be flushed soon
   mUpdateManager->EventProcessingStarted();
 
+  // Scene could be added or removed while processing the events
+  // Copy the Scene container locally to avoid possibly invalid iterator
+  std::vector<ScenePtr> scenes = mScenes;
+
   // process events in all scenes
-  for( auto iter = mScenes.begin(); iter != mScenes.end(); ++iter )
+  for( auto iter = scenes.begin(); iter != scenes.end(); ++iter )
   {
     (*iter)->ProcessEvents();
   }
@@ -277,7 +281,7 @@ void Core::ProcessEvents()
   mNotificationManager->ProcessMessages();
 
   // Emit signal here to inform listeners that event processing has finished.
-  for( auto iter = mScenes.begin(); iter != mScenes.end(); ++iter )
+  for( auto iter = scenes.begin(); iter != scenes.end(); ++iter )
   {
     (*iter)->EmitEventProcessingFinishedSignal();
   }
@@ -289,7 +293,7 @@ void Core::ProcessEvents()
   mRelayoutController->Relayout();
 
   // Rebuild depth tree after event processing has finished
-  for( auto iter = mScenes.begin(); iter != mScenes.end(); ++iter )
+  for( auto iter = scenes.begin(); iter != scenes.end(); ++iter )
   {
     (*iter)->RebuildDepthTree();
   }