[Tizen](Vector) Change to call dlopen and dlclose once 92/222592/1
authorHeeyong Song <heeyong.song@samsung.com>
Thu, 16 Jan 2020 09:46:26 +0000 (18:46 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Thu, 16 Jan 2020 09:46:26 +0000 (18:46 +0900)
Change-Id: I4e1eeabf8a00ea0d01cb96dbe6f78d6103c349dd

dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.cpp
dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.h

index a1f6b82..6c9aa2a 100644 (file)
@@ -39,9 +39,39 @@ const char* DEFAULT_OBJECT_NAME( "libdali-vector-animation-renderer-plugin.so" )
 
 }
 
+VectorAnimationRendererPluginProxy::LibraryLoader::LibraryLoader( const std::string& name )
+: mLibHandle( NULL )
+{
+  mLibHandle = dlopen( name.c_str(), RTLD_LAZY );
+
+  char* error = dlerror();
+  if( mLibHandle == NULL || error != NULL )
+  {
+    DALI_LOG_ERROR( "VectorAnimationRendererPluginProxy::LibraryLoader: dlopen error [%s]\n", error );
+  }
+}
+
+VectorAnimationRendererPluginProxy::LibraryLoader::~LibraryLoader()
+{
+  if( mLibHandle && dlclose( mLibHandle ) )
+  {
+    DALI_LOG_ERROR( "Error closing vector animation renderer plugin library: %s\n", dlerror() );
+  }
+}
+
+void* VectorAnimationRendererPluginProxy::LibraryLoader::GetLibHandle()
+{
+  return mLibHandle;
+}
+
+void* VectorAnimationRendererPluginProxy::GetLibHandle( const std::string& name )
+{
+  static VectorAnimationRendererPluginProxy::LibraryLoader loader( name );
+  return loader.GetLibHandle();
+}
+
 VectorAnimationRendererPluginProxy::VectorAnimationRendererPluginProxy( const std::string& sharedObjectName )
 : mSharedObjectName(),
-  mLibHandle( NULL ),
   mPlugin( NULL ),
   mCreateVectorAnimationRendererPtr( NULL ),
   mDefaultSignal()
@@ -64,29 +94,21 @@ VectorAnimationRendererPluginProxy::~VectorAnimationRendererPluginProxy()
   {
     delete mPlugin;
     mPlugin = NULL;
-
-    if( mLibHandle && dlclose( mLibHandle ) )
-    {
-      DALI_LOG_ERROR( "Error closing vector animation renderer plugin library: %s\n", dlerror() );
-    }
   }
 }
 
 void VectorAnimationRendererPluginProxy::Initialize()
 {
-  mLibHandle = dlopen( mSharedObjectName.c_str(), RTLD_LAZY );
-
-  char* error = dlerror();
-  if( mLibHandle == NULL || error != NULL )
+  void* libHandle = VectorAnimationRendererPluginProxy::GetLibHandle( mSharedObjectName );
+  if( !libHandle )
   {
-    DALI_LOG_ERROR( "VectorAnimationRendererPluginProxy::Initialize: dlopen error [%s]\n", error );
-    return;
+    DALI_LOG_ERROR( "VectorAnimationRendererPluginProxy::Initialize: Cannot load library: %s\n", mSharedObjectName.c_str() );
   }
 
   // load plugin
-  mCreateVectorAnimationRendererPtr = reinterpret_cast< CreateVectorAnimationRendererFunction >( dlsym( mLibHandle, "CreateVectorAnimationRendererPlugin" ) );
+  mCreateVectorAnimationRendererPtr = reinterpret_cast< CreateVectorAnimationRendererFunction >( dlsym( libHandle, "CreateVectorAnimationRendererPlugin" ) );
 
-  error = dlerror();
+  char* error = dlerror();
   if( mCreateVectorAnimationRendererPtr == NULL || error != NULL )
   {
     DALI_LOG_ERROR( "VectorAnimationRendererPluginProxy::Initialize: Cannot load symbol: %s\n", error );
index b09c8b9..6e1e3f1 100644 (file)
@@ -115,6 +115,27 @@ public:
 
 private:
 
+  class LibraryLoader
+  {
+  public:
+
+    LibraryLoader( const std::string& name );
+
+    virtual ~LibraryLoader();
+
+    void* GetLibHandle();
+
+  private:
+
+    LibraryLoader( const LibraryLoader& loader ) = delete;
+    LibraryLoader& operator=( const LibraryLoader& loader ) = delete;
+
+  private:
+    void* mLibHandle;
+  };
+
+  static void* GetLibHandle( const std::string& name );
+
   /**
    * Dynamically loads the plugin.
    */
@@ -125,7 +146,6 @@ private:
   using CreateVectorAnimationRendererFunction = Dali::VectorAnimationRendererPlugin* (*)();
 
   std::string                            mSharedObjectName;   ///< Shared object name
-  void*                                  mLibHandle;          ///< Handle for the loaded library
   Dali::VectorAnimationRendererPlugin*   mPlugin;             ///< Plugin handle
 
   CreateVectorAnimationRendererFunction  mCreateVectorAnimationRendererPtr;   ///< Function pointer called in adaptor to create a plugin instance