From: sunghyun kim Date: Fri, 26 Jan 2024 06:42:13 +0000 (+0900) Subject: Fix crash issue when restarting widgetApp X-Git-Tag: accepted/tizen/unified/20240614.010925^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7ea8e1953978a0db227deb2b4e9ae49c29470072;p=platform%2Fcore%2Fuifw%2Fwidget-viewer-dali.git Fix crash issue when restarting widgetApp 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 --- 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 f5ec349..3a499db 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -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); diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.h b/widget_viewer_dali/internal/widget_view/widget_view_impl.h index 1c270a4..3369835 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -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