Fix crash issue when restarting widgetApp 78/312078/1 accepted/tizen/unified/20240614.010925 accepted/tizen/unified/dev/20240620.010419 accepted/tizen/unified/toolchain/20240624.121309 accepted/tizen/unified/x/20240614.080536 accepted/tizen/unified/x/asan/20240625.091956
authorsunghyun kim <scholb.kim@samsung.com>
Fri, 26 Jan 2024 06:42:13 +0000 (15:42 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Tue, 4 Jun 2024 04:37:52 +0000 (13:37 +0900)
In the existing code, the remote surface was cleared here.
However, in general, WIDGET_INSTANCE_EVENT_FAULT is called later, so we can clear it at that time.

Currently, if we clear in advance at this point, a crash may occur in the process of restarting the widget.
(It seems that the malloc issue occurs in the process of replacing the existing callback)

Therefore, to avoid this crash, delete the part that was cleared at this point.

Change-Id: I4f54546a36295ae26382a39bb13913153b32cf69

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp
widget_viewer_dali/internal/widget_view/widget_view_impl.h

index f5ec349c1b798787323fc1b4ea494923f320e256..3a499dbc98ad6641309f0cc960f7c300d77af3fd 100644 (file)
@@ -169,12 +169,6 @@ static void OnBufferAdded( const char *appid, const char *instance_id, const int
 
 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
 {
-  Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
-
-  if( widgetView && !widgetView->IsWidgetFaulted() )
-  {
-    widgetView->CloseRemoteSurface();
-  }
 }
 
 } // unnamed namespace
@@ -243,7 +237,8 @@ WidgetView::WidgetView()
   mPausedManually( false ),
   mWindowVisible( true ),
   mPreviewEnable( true ),
-  mKeepWidgetSize(false)
+  mKeepWidgetSize(false),
+  mIsReadyToRender(false)
 {
 }
 
@@ -270,7 +265,8 @@ WidgetView::WidgetView( const std::string& widgetId, const std::string& contentI
   mPausedManually( false ),
   mWindowVisible( true ),
   mPreviewEnable( true ),
-  mKeepWidgetSize(false)
+  mKeepWidgetSize(false),
+  mIsReadyToRender(false)
 {
 }
 
@@ -563,19 +559,27 @@ void WidgetView::CreateWidgetRenderer()
   Dali::WidgetView::WidgetView handle( GetOwner() );
   mWidgetAddedSignal.Emit( handle );
 
+  // Renderer is created by WidgetView
+  mIsReadyToRender = true;
+
   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetRenderer: Widget image is added. [%p]\n", this );
 }
 
 void WidgetView::RemoveWidgetRenderer()
 {
-  if( mRenderer )
+  if(mIsReadyToRender)
   {
-    Self().RemoveRenderer( mRenderer );
+    if( mRenderer )
+    {
+      Self().RemoveRenderer( mRenderer );
 
-    ShowRetryState( true );
+      ShowRetryState( true );
 
-    Dali::WidgetView::WidgetView handle( GetOwner() );
-    mWidgetDeletedSignal.Emit( handle );
+      Dali::WidgetView::WidgetView handle( GetOwner() );
+      mWidgetDeletedSignal.Emit( handle );
+
+      mIsReadyToRender = false;
+    }
   }
 
   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetRenderer: Widget image is removed. [%p]\n", this );
@@ -682,6 +686,8 @@ void WidgetView::SendWidgetEvent( int event )
     }
     case WIDGET_INSTANCE_EVENT_FAULT:
     {
+      mResizeRequired = true;
+      RemoveWidgetRenderer();
       mWidgetFaultedSignal.Emit( handle );
       CloseRemoteSurface();
       break;
@@ -1201,9 +1207,9 @@ void WidgetView::OnSizeSet( const Vector3& targetSize )
 {
 }
 
-bool WidgetView::IsWidgetRenderer()
+bool WidgetView::IsReadyToRender()
 {
-  return ( mRenderer )? true: false;
+  return mIsReadyToRender;
 }
 
 void WidgetView::UpdateImageSource( tbm_surface_h source )
@@ -1745,7 +1751,7 @@ bool WidgetView::TouchEvent( const Dali::TouchEvent& event )
 
 void WidgetView::UpdateBuffer( struct tizen_remote_surface *surface, struct wl_buffer *buffer, int32_t fd)
 {
-  if( !IsWidgetRenderer() )
+  if( !IsReadyToRender() )
   {
     tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
 
index 1c270a41b69876b1c0bb3c8b3a5716b03219260d..3369835c1fb64d7e82f71204ea38c977649217cb 100644 (file)
@@ -250,9 +250,9 @@ public: // Internal API
   bool IsPermanentDelete();
 
   /**
-   * @brief Checks Widget Renderer exist
+   * @brief Checks Widget is ready to render
    */
-  bool IsWidgetRenderer();
+  bool IsReadyToRender();
 
   /**
    * @brief Updates image source when buffer is updated
@@ -558,6 +558,7 @@ private:
   bool mWindowVisible;                       ///< Check whether window is visible or not
   bool mPreviewEnable;                       ///< Check whether preview is enable or not
   bool mKeepWidgetSize;                      ///< Check whether widget instance keep it's size or not
+  bool mIsReadyToRender;                     ///< Check whether widget is ready to render or not
   Dali::Property::Map mEffectPropertyMap;    ///< Shader for effect
 
   // Notification for property change confirmation