From: Heeyong Song Date: Thu, 29 Jun 2017 08:52:26 +0000 (+0900) Subject: Fix a crash when the same image is set repeatedly X-Git-Tag: dali_1.2.47~7^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=de0c0ef70719409ce6accc801ff664612a96495e Fix a crash when the same image is set repeatedly Change-Id: I7a31401f8dc9b1fd1065d31be40e356839fbc6d4 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp index 16f9fef..25779d5 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp @@ -842,6 +842,58 @@ int UtcDaliImageVisualTextureCancelRemoteLoad(void) END_TEST; } +int UtcDaliImageVisualTextureCancelAsyncLoad(void) +{ + ToolkitTestApplication application; + tet_infoline( "Load image asynchronosly, cancel loading, then load again" ); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable( true ); + TraceCallStack& drawTrace = gl.GetDrawTrace(); + drawTrace.Enable( true ); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() ); + dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual ); + + Stage::GetCurrent().Add( actor ); + + // Cancel loading + Stage::GetCurrent().Remove( actor ); + + Stage::GetCurrent().Add( actor ); + + // Create another visual with the same image + visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual ); + + application.SendNotification(); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION ); + + END_TEST; +} + int UtcDaliImageVisualSetInvalidAsyncImage(void) { ToolkitTestApplication application; diff --git a/dali-toolkit/internal/visuals/texture-manager.cpp b/dali-toolkit/internal/visuals/texture-manager.cpp index 0c839ad..7334b48 100644 --- a/dali-toolkit/internal/visuals/texture-manager.cpp +++ b/dali-toolkit/internal/visuals/texture-manager.cpp @@ -654,12 +654,15 @@ void TextureManager::ObserverDestroyed( TextureUploadObserver* observer ) for( unsigned int i = 0; i < count; ++i ) { TextureInfo& textureInfo( mTextureInfoContainer[i] ); - for( TextureInfo::ObserverListType::Iterator j = textureInfo.observerList.Begin(); j != textureInfo.observerList.End(); ++j ) + for( TextureInfo::ObserverListType::Iterator j = textureInfo.observerList.Begin(); j != textureInfo.observerList.End(); ) { if( *j == observer ) { - textureInfo.observerList.Erase( j ); - break; + j = textureInfo.observerList.Erase( j ); + } + else + { + ++j; } } }