From ab228daf96fef0443477af7479b06dc73dcff7d0 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Thu, 16 Jan 2020 18:46:26 +0900 Subject: [PATCH] [Tizen](Vector) Change to call dlopen and dlclose once Change-Id: I4e1eeabf8a00ea0d01cb96dbe6f78d6103c349dd --- .../vector-animation-renderer-plugin-proxy.cpp | 50 ++++++++++++++++------ .../vector-animation-renderer-plugin-proxy.h | 22 +++++++++- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.cpp b/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.cpp index a1f6b82..6c9aa2a 100644 --- a/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.cpp +++ b/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.cpp @@ -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 ); diff --git a/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.h b/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.h index b09c8b9..6e1e3f1 100644 --- a/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.h +++ b/dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.h @@ -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 -- 2.7.4