[4.0] fixed crash issue during repeated creation and deletion at 11/186311/1 accepted/tizen/4.0/unified/20181011.183821 submit/tizen_4.0/20181004.072517 submit/tizen_4.0/20181005.021603 submit/tizen_4.0/20181010.011946
authorJoogab Yun <joogab.yun@samsung.com>
Thu, 9 Aug 2018 01:35:53 +0000 (10:35 +0900)
committerJoogab Yun <joogab.yun@samsung.com>
Thu, 9 Aug 2018 01:48:35 +0000 (10:48 +0900)
RemoveWidget

Change-Id: I37ddf2845dfbdec95033227c08653ea79d8302b5

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp [changed mode: 0644->0755]
widget_viewer_dali/internal/widget_view/widget_view_impl.h [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 1f4fa26..3f2e18e
@@ -44,7 +44,6 @@
 #include <unistd.h>
 #include <libintl.h>
 #include <xkbcommon/xkbcommon.h>
-#include <dali/devel-api/images/native-image-interface-extension.h>
 
 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 );
old mode 100644 (file)
new mode 100755 (executable)
index cbce70b..3feef26
@@ -31,7 +31,6 @@
 #include <wayland-extension/tizen-remote-surface-client-protocol.h>
 #include <tbm_surface.h>
 #include <screen_connector_toolkit.h>
-#include <dali/integration-api/adaptors/trigger-event-factory.h>
 
 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
 
   /**