To avoid crash issue when TerminateWidget() is called 64/249464/2 accepted/tizen/6.0/unified/20201213.214053 submit/tizen_6.0/20201212.071057
authorSunghyun Kim <scholb.kim@samsung.com>
Sat, 12 Dec 2020 05:44:57 +0000 (14:44 +0900)
committerSunghyun Kim <scholb.kim@samsung.com>
Sat, 12 Dec 2020 06:57:26 +0000 (15:57 +0900)
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

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp

index 41eb01cc5c69c469bc39c6d2c563c9a151ba78b1..5d400efadb35ffddd3ba12eac627d8da4f0791a5 100644 (file)
@@ -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);