From cb0f915c4ece8b85053b63e1927be1cc16545430 Mon Sep 17 00:00:00 2001 From: Sunghyun Kim Date: Sat, 12 Dec 2020 14:44:57 +0900 Subject: [PATCH] To avoid crash issue when TerminateWidget() is called 1) Clear update callback for block calling update callback RemoteSurface and other resource need to clear even if widget_instance_destroy() is failed. 2) Set Flag for block update callback Sometimes, UpdateBuffer is called even if widgetview is destroyed. For avoid this problem, skip rendering when flag is set. Change-Id: I0d1f84623bbc2456c0b6b4a4c02f96fe6f7edd6c --- .../internal/widget_view/widget_view_impl.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp index 41eb01c..5d400ef 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -641,8 +641,7 @@ bool WidgetView::TerminateWidget() ret = widget_instance_destroy( mInstanceId.c_str() ); if( ret < 0 ) { - DALI_LOG_ERROR("widget_instance_destroy() is failed."); - return false; + DALI_LOG_ERROR("widget_instance_destroy() is failed. ret:%d, id:%s \n",ret, mInstanceId.c_str()); } Dali::WidgetView::WidgetView handle( GetOwner() ); @@ -653,12 +652,13 @@ bool WidgetView::TerminateWidget() mInstanceId.clear(); CloseRemoteSurface(); + SetPermanentDelete(true); mCreated = false; mResizeRequired = false; mPausedManually = false; - return true; + return ( (ret < 0)? false : true ); } DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::TerminateWidget: Widget is terminated/destroyed and deleted signal is emitted.\n" ); @@ -1693,6 +1693,14 @@ bool WidgetView::TouchEvent( const Dali::TouchEvent& event ) void WidgetView::UpdateBuffer( struct tizen_remote_surface *surface, struct wl_buffer *buffer, int32_t fd) { + // Sometimes, UpdateBuffer is called even if widgetview is destroyed. + // This behavior can cause a crash, so it does not render. + if( IsPermanentDelete() ) + { + DALI_LOG_ERROR("This widgetView is deleted already. so don't try update bufffer."); + return; + } + if( !IsWidgetRenderer() ) { tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE); -- 2.34.1