summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKapildev Patel <kpatel@jp.adit-jv.com>2017-04-24 18:58:31 +0900
committerJens Lorenz <jlorenz@de.adit-jv.com>2017-09-29 11:42:01 +0200
commit3e9f7977dc599b6a91e875c8239480f212a4cd3a (patch)
tree072aeba3a6245eaa6470d7cd21c58afe93d5d051
parentf620be8a774f966fbd76ca8892a39ce28037a213 (diff)
downloadaudiomanager-3e9f7977dc599b6a91e875c8239480f212a4cd3a.tar.gz
AM: Destroy plugin implementation.
With these changes AudioManager would call destroy function of the controller plugin at the time of shutdown. Signed-off-by: Kapildev Patel <kpatel@jp.adit-jv.com>
-rw-r--r--AudioManagerCore/include/CAmControlSender.h1
-rw-r--r--AudioManagerCore/include/TAmPluginTemplate.h91
-rw-r--r--AudioManagerCore/src/CAmControlSender.cpp16
-rw-r--r--AudioManagerUtilities/include/TAmPluginTemplate.h34
4 files changed, 48 insertions, 94 deletions
diff --git a/AudioManagerCore/include/CAmControlSender.h b/AudioManagerCore/include/CAmControlSender.h
index 40ab379..2c31cf9 100644
--- a/AudioManagerCore/include/CAmControlSender.h
+++ b/AudioManagerCore/include/CAmControlSender.h
@@ -147,6 +147,7 @@ private:
IAmControlSend* mController; //!< pointer to the ControlSend interface
static CAmControlSender* mInstance;
int16_t mSignal;
+ std::string mControlPluginFile;
};
}
diff --git a/AudioManagerCore/include/TAmPluginTemplate.h b/AudioManagerCore/include/TAmPluginTemplate.h
deleted file mode 100644
index f000fbe..0000000
--- a/AudioManagerCore/include/TAmPluginTemplate.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * SPDX license identifier: MPL-2.0
- *
- * Copyright (C) 2012, BMW AG
- *
- * This file is part of GENIVI Project AudioManager.
- *
- * Contributions are licensed to the GENIVI Alliance under one or more
- * Contribution License Agreements.
- *
- * \copyright
- * This Source Code Form is subject to the terms of the
- * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
- * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *
- * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012
- *
- * \file TAmPluginTemplate.h
- * For further information see http://www.genivi.org/.
- *
- */
-
-#ifndef PLUGINTEMPLATE_H_
-#define PLUGINTEMPLATE_H_
-
-#include <dlfcn.h>
-#include <libgen.h>
-#include "CAmDltWrapper.h"
-
-namespace am
-{
-
-/**
- * * This template tries to load a library and cast to a class
- * @param libname the full path to the library to be loaded
- * @param libraryHandle the handle to the library that gets returned
- * @return returns the pointer to the class to be loaded
- */
-template<class T> T* getCreateFunction(const std::string& libname, void*& libraryHandle)
-{
-
- logInfo("getCreateFunction : Trying to load library with name: ",libname);
-
- // cut off directories
- char* fileWithPath = const_cast<char*>(libname.c_str());
- std::string libFileName = basename(fileWithPath);
-
- // cut off "lib" in front and cut off .so end"
- std::string createFunctionName = libFileName.substr(3, libFileName.length() - 6) + "Factory";
- // open library
- dlerror(); // Clear any existing error
- libraryHandle = dlopen(libname.c_str(), RTLD_LAZY );
- const char* dlopen_error = dlerror();
- if (!libraryHandle || dlopen_error)
- {
- logError("getCreateFunction : dlopen failed",dlopen_error);
- return (0);
- }
-
- // get entry point from shared lib
- dlerror(); // Clear any existing error
-
- union
- {
- void* voidPointer;
- T* typedPointer;
- } functionPointer;
-
- // Note: direct cast is not allowed by ISO C++. e.g.
- // T* createFunction = reinterpret_cast<T*>(dlsym(libraryHandle, createFunctionName.c_str()));
- // compiler warning: "forbids casting between pointer-to-function and pointer-to-object"
-
- functionPointer.voidPointer = dlsym(libraryHandle, createFunctionName.c_str());
- T* createFunction = functionPointer.typedPointer;
-
- const char* dlsym_error = dlerror();
- if (!createFunction || dlsym_error)
- {
- logError("getCreateFunction: Failed to load shared lib entry point",dlsym_error);
- }
- else
- {
- logInfo("getCreateFunction : loaded successfully plugin", createFunctionName);
- }
- return (createFunction);
-}
-
-}
-
-#endif /* PLUGINTEMPLATE_H_ */
diff --git a/AudioManagerCore/src/CAmControlSender.cpp b/AudioManagerCore/src/CAmControlSender.cpp
index a12373c..ce5d132 100644
--- a/AudioManagerCore/src/CAmControlSender.cpp
+++ b/AudioManagerCore/src/CAmControlSender.cpp
@@ -115,7 +115,7 @@ CAmControlSender::CAmControlSender(std::string controlPluginFile,CAmSocketHandle
createFunc = getCreateFunction<IAmControlSend*()>(controlPluginFile, mlibHandle);
assert(createFunc!=NULL);
mController = createFunc();
-
+ mControlPluginFile = controlPluginFile;
//check libversion
std::string version, cVersion(ControlVersion);
mController->getInterfaceVersion(version);
@@ -155,8 +155,18 @@ CAmControlSender::~CAmControlSender()
{
close(mPipe[0]);
close(mPipe[1]);
- //if (mlibHandle)
- // dlclose(mlibHandle);
+ void (*destroyFunc)(IAmControlSend*);
+ destroyFunc = getDestroyFunction<void(IAmControlSend*)>(mControlPluginFile,mlibHandle);
+ assert(destroyFunc!=NULL);
+ destroyFunc(mController);
+ if(mlibHandle)
+ {
+ dlclose(mlibHandle);
+ }
+ else
+ {
+ logError("CAmControlSender Dtor: mlibHandle is invalid");
+ }
}
am_Error_e CAmControlSender::hookUserConnectionRequest(const am_sourceID_t sourceID, const am_sinkID_t sinkID, am_mainConnectionID_t & mainConnectionID)
diff --git a/AudioManagerUtilities/include/TAmPluginTemplate.h b/AudioManagerUtilities/include/TAmPluginTemplate.h
index f000fbe..8034497 100644
--- a/AudioManagerUtilities/include/TAmPluginTemplate.h
+++ b/AudioManagerUtilities/include/TAmPluginTemplate.h
@@ -86,6 +86,40 @@ template<class T> T* getCreateFunction(const std::string& libname, void*& librar
return (createFunction);
}
+/**
+ * * This template tries to destroy
+ * @param libname the full path to the library to be loaded
+ *
+ */
+template<class T> T* getDestroyFunction(const std::string& libname,void* libraryHandle)
+{
+ logInfo("destroy : Trying to destroy : ",libname);
+ // cut off directories
+ char* fileWithPath = const_cast<char*>(libname.c_str());
+ std::string libFileName = basename(fileWithPath);
+ // cut off "lib" in front and cut off .so end"
+ std::string destroyFunctionName = "destroy" + libFileName.substr(3, libFileName.length() - 6);
+ dlerror(); // Clear any existing error
+ union
+ {
+ void* voidPointer;
+ T* typedPointer;
+ } functionPointer;
+ functionPointer.voidPointer = dlsym(libraryHandle, destroyFunctionName.c_str());
+ T* destroyFunction = functionPointer.typedPointer;
+ const char* dlsym_error = dlerror();
+ if (!destroyFunction || dlsym_error)
+ {
+ logError("getDestroyFunction: Failed to load shared lib entry point function name=",
+ destroyFunctionName, "error=",dlsym_error);
+ }
+ else
+ {
+ logInfo("getDestroyFunction: loaded successfully plugin", destroyFunctionName);
+ }
+ return (destroyFunction);
+}
+
}
#endif /* PLUGINTEMPLATE_H_ */