From: Joogab Yun Date: Thu, 9 Aug 2018 01:35:53 +0000 (+0900) Subject: [4.0] fixed crash issue during repeated creation and deletion at X-Git-Tag: submit/tizen_4.0/20181004.072517^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F11%2F186311%2F1;p=platform%2Fcore%2Fuifw%2Fwidget-viewer-dali.git [4.0] fixed crash issue during repeated creation and deletion at RemoveWidget Change-Id: I37ddf2845dfbdec95033227c08653ea79d8302b5 --- diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp old mode 100644 new mode 100755 index 1f4fa26..3f2e18e --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -44,7 +44,6 @@ #include #include #include -#include namespace Dali { @@ -228,12 +227,8 @@ static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type widgetView->ConnectSignal( surface ); } - //get tbm surface from buffer - tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) ); - widgetView->UpdateImageSource( tbmSurface, buffer, surface); + widgetView->UpdateImageSource( buffer, surface, img_file_fd); } - - close( img_file_fd ); } static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data ) @@ -246,8 +241,8 @@ static void OnSurfaceRemoved( const char *appid, const char *instance_id, const if( widgetView && !widgetView->IsWidgetFaulted() ) { - widgetView->RemoveWidget(); - widgetView->EmitDeletedWidgetSignal(); + widgetView->CloseRemoteSurface(); + widgetView->RemoveWidgetRenderer(); } } @@ -548,12 +543,25 @@ void WidgetView::CreateWidgetRenderer() DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetRenderer: Widget image is added.\n" ); } +void WidgetView::RemoveWidgetRenderer() +{ + if( mRenderer ) + { + Self().RemoveRenderer( mRenderer ); + + ShowRetryState( true ); + + Dali::WidgetView::WidgetView handle( GetOwner() ); + mWidgetDeletedSignal.Emit( handle ); + } + + DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetRenderer: Widget image is removed.\n" ); +} + bool WidgetView::TerminateWidget() { if( !mWidgetId.empty() && !mInstanceId.empty() ) { - RemoveWidget(); - int ret = 0; ret = widget_instance_terminate( mInstanceId.c_str() ); @@ -569,12 +577,12 @@ bool WidgetView::TerminateWidget() Dali::WidgetView::WidgetView handle( GetOwner() ); mWidgetTerminatedSignal.Emit( handle ); - - EmitDeletedWidgetSignal(); + mWidgetDeletedSignal.Emit( handle ); mWidgetId.clear(); mInstanceId.clear(); + CloseRemoteSurface(); return true; } @@ -606,8 +614,8 @@ void WidgetView::SendWidgetEvent( int event ) case WIDGET_INSTANCE_EVENT_FAULT: { mWidgetFaultedSignal.Emit( handle ); - RemoveWidget(); - ShowRetryState( true ); + CloseRemoteSurface(); + RemoveWidgetRenderer(); break; } case WIDGET_INSTANCE_EVENT_CREATE_ABORTED: @@ -1011,72 +1019,32 @@ bool WidgetView::IsWidgetRenderer() return ( mRenderer )? true: false; } - -class DestructorCallback: public CallbackBase +void WidgetView::UpdateImageSource( struct wl_buffer *buffer , struct tizen_remote_surface *surface, int32_t img_file_fd ) { -public: - DestructorCallback(void *buffer ,void *surface) - :CallbackBase( reinterpret_cast< void* >( this ), - NULL, // we get the dispatcher to call function directly - reinterpret_cast< CallbackBase::Dispatcher>( &DestructorCallback::Dispatcher) ), - mWlBuffer( buffer ), - mRemoteSurface( surface ) { - - } - - void RunCallback() - { - struct wl_buffer *buffer = static_cast< struct wl_buffer* >(mWlBuffer); - struct tizen_remote_surface *surface = static_cast< struct tizen_remote_surface* >(mRemoteSurface); - if (tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) - { - tizen_remote_surface_release( surface, buffer ); - tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( buffer ); - tbm_surface_internal_unref( preTbmSurface ); - wl_buffer_destroy( buffer ); - } - } + //get tbm surface from buffer + tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) ); + mImageSource = Dali::NativeImageSource::New( tbmSurface ); + Dali::NativeImage image = Dali::NativeImage::New( *mImageSource ); - static void Dispatcher( CallbackBase& base ) + if( mRenderer ) { - DestructorCallback& callback( static_cast< DestructorCallback& >( base) ); - callback.RunCallback(); + Dali::TextureSet textureSet = mRenderer.GetTextures(); + Dali::TextureSetImage( textureSet, 0u, image ); + mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true ); } - ~DestructorCallback() + if( mWlBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION ) { + tizen_remote_surface_release( surface, mWlBuffer ); + tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( mWlBuffer ); + tbm_surface_internal_unref( preTbmSurface ); + wl_buffer_destroy( mWlBuffer ); } -private: - void *mWlBuffer ; - void *mRemoteSurface; -}; - - -void WidgetView::UpdateImageSource( tbm_surface_h source , struct wl_buffer *buffer , struct tizen_remote_surface *surface) -{ - DestructorCallback* callback = new DestructorCallback( buffer, surface ); - TriggerEventFactory triggerEventFactory; - TriggerEventInterface* notification = triggerEventFactory.CreateTriggerEvent( callback, - TriggerEventInterface::DELETE_AFTER_TRIGGER ); + mRemoteSurface = surface; mWlBuffer = buffer; - mImageSource = Dali::NativeImageSource::New( source ); - Dali::NativeImage image = Dali::NativeImage::New( *mImageSource ); - - NativeImageInterfacePtr mImageSourcePtr = static_cast< NativeImageInterfacePtr >(mImageSource); - NativeImageInterface::Extension* extension = mImageSourcePtr->GetExtension(); - if( extension ) - { - extension->SetDestructorNotification( notification ); - } - - if( mRenderer ) - { - Dali::TextureSet textureSet = mRenderer.GetTextures(); - Dali::TextureSetImage( textureSet, 0u, image ); - mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true ); - } + close( img_file_fd ); } void WidgetView::ConnectSignal( tizen_remote_surface* surface ) @@ -1223,55 +1191,23 @@ float WidgetView::GetWidthForHeight( float height ) } } -void WidgetView::RemoveWidget() +void WidgetView::CloseRemoteSurface() { - if( mRemoteSurface != NULL ) - { - tizen_remote_surface_transfer_visibility( mRemoteSurface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE); - } - - if(mImageSource) + if( mWatcherHandle != NULL ) { - // Delete trigger - NativeImageInterfacePtr mImageSourcePtr = static_cast< NativeImageInterfacePtr >( mImageSource ); - NativeImageInterface::Extension* extension = mImageSourcePtr->GetExtension(); - if( extension ) + if( mRemoteSurface != NULL && mWlBuffer != NULL && tizen_remote_surface_get_version( mRemoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION ) { - extension->SetDestructorNotification( NULL ); - } - } - - mImageSource = Dali::NativeImageSource::New( NULL ); - - if( mRenderer ) - { - mImageSource = NULL; - Self().RemoveRenderer( mRenderer ); - mRenderer.Reset(); - } - - if( mWatcherHandle != NULL && mRemoteSurface != NULL ) - { - // Release tizen remote surface - if(mWlBuffer != NULL) - { - struct wl_buffer *buffer = mWlBuffer; - struct tizen_remote_surface *surface = mRemoteSurface; - if (tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) - { - tizen_remote_surface_release( surface, buffer ); - tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( buffer ); - tbm_surface_internal_unref( preTbmSurface ); - wl_buffer_destroy( buffer ); - mWlBuffer = NULL; - } + tizen_remote_surface_release( mRemoteSurface, mWlBuffer ); + tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( mWlBuffer ); + tbm_surface_internal_unref( preTbmSurface ); + wl_buffer_destroy( mWlBuffer ); + mWlBuffer = NULL; } - screen_connector_toolkit_remove( mWatcherHandle ); - mWatcherHandle = NULL; - mRemoteSurface = NULL; - mPid = -1; } + mWatcherHandle = NULL; + mRemoteSurface = NULL; + mPid = -1; } void WidgetView::ShowLoadingState( bool show ) @@ -1682,15 +1618,6 @@ bool WidgetView::GetStringFromProperty( const Dali::Property::Value& value, std: return extracted; } -void WidgetView::EmitDeletedWidgetSignal() -{ - if( !mWidgetId.empty() ) - { - Dali::WidgetView::WidgetView handle( GetOwner() ); - mWidgetDeletedSignal.Emit( handle ); - } -} - void WidgetView::OnRelayout( const Vector2& size, RelayoutContainer& container ) { Control::OnRelayout( size, container ); diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.h b/widget_viewer_dali/internal/widget_view/widget_view_impl.h old mode 100644 new mode 100755 index cbce70b..3feef26 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -31,7 +31,6 @@ #include #include #include -#include namespace Dali { @@ -131,13 +130,13 @@ public: // Internal API void SetPermanentDelete( bool permanentDelete ); - void RemoveWidget(); + void RemoveWidgetRenderer(); bool IsPermanentDelete(); bool IsWidgetRenderer(); - void UpdateImageSource( tbm_surface_h source , struct wl_buffer *buffer , struct tizen_remote_surface *surface); + void UpdateImageSource( struct wl_buffer *buffer , struct tizen_remote_surface *surface, int32_t img_file_fd ); void CreateWidgetRenderer(); @@ -147,6 +146,8 @@ public: // Internal API bool OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event ); + void CloseRemoteSurface(); + void SetLoadingTextPropertyMap( Dali::Property::Map map ); void SetRetryTextPropertyMap( Dali::Property::Map map ); @@ -167,8 +168,6 @@ public: // Internal API bool TouchEvent( const Dali::TouchData& event ); - void EmitDeletedWidgetSignal(); - public: //Signals /**