diff options
author | Kevin Rocard <kevinx.rocard@intel.com> | 2013-07-05 10:56:27 +0200 |
---|---|---|
committer | David Wagner <david.wagner@intel.com> | 2014-02-12 17:04:06 +0100 |
commit | ee7ceed5cca416718c70f3ca55fe41b8eb1e11a3 (patch) | |
tree | de56e2b57a47d033b14f848f49a45c1f098160f8 | |
parent | 7f1729aa56b52afad1ac2c390582bdc41145de9e (diff) | |
download | external_parameter-framework-ee7ceed5cca416718c70f3ca55fe41b8eb1e11a3.zip external_parameter-framework-ee7ceed5cca416718c70f3ca55fe41b8eb1e11a3.tar.gz external_parameter-framework-ee7ceed5cca416718c70f3ca55fe41b8eb1e11a3.tar.bz2 |
Optional fallback on virtual subsystem
BZ: 122982
When the PFW starts, it loads subsystems using their corresponding
plugins. If a requested plugin is not found, the start fails. This is a
problem, as for host, plugins are not compiled.
Add an option to fallback on virtual subsystem if a plugin is not found
during load.
Change-Id: Id408873fdc904612c0c741524b33025d7d199fe9
Signed-off-by: Kevin Rocard <kevinx.rocard@intel.com>
Reviewed-on: http://android.intel.com:8080/117709
Reviewed-by: Centelles, Sylvain <sylvain.centelles@intel.com>
Tested-by: Barthes, FabienX <fabienx.barthes@intel.com>
Reviewed-by: cactus <cactus@intel.com>
Tested-by: cactus <cactus@intel.com>
-rw-r--r-- | parameter/SystemClass.cpp | 88 | ||||
-rw-r--r-- | parameter/SystemClass.h | 38 |
2 files changed, 66 insertions, 60 deletions
diff --git a/parameter/SystemClass.cpp b/parameter/SystemClass.cpp index f3477c6..8dd5f9c 100644 --- a/parameter/SystemClass.cpp +++ b/parameter/SystemClass.cpp @@ -1,8 +1,8 @@ -/* +/* * INTEL CONFIDENTIAL - * Copyright © 2011 Intel + * Copyright © 2011 Intel * Corporation All Rights Reserved. - * + * * The source code contained or described herein and all documents related to * the source code ("Material") are owned by Intel Corporation or its suppliers * or licensors. Title to the Material remains with Intel Corporation or its @@ -12,13 +12,13 @@ * treaty provisions. No part of the Material may be used, copied, reproduced, * modified, published, uploaded, posted, transmitted, distributed, or * disclosed in any way without Intel’s prior express written permission. - * + * * No license under any patent, copyright, trade secret or other intellectual * property right is granted to or conferred upon you by disclosure or delivery * of the Materials, either expressly, by implication, inducement, estoppel or * otherwise. Any license under such intellectual property rights must be * express and approved by Intel in writing. - * + * * CREATED: 2011-06-01 * UPDATED: 2011-07-27 */ @@ -33,6 +33,7 @@ #include "NamedElementBuilderTemplate.h" #include <assert.h> #include "PluginLocation.h" +#include "Utility.h" #define base CConfigurableElement @@ -73,9 +74,10 @@ string CSystemClass::getKind() const return "SystemClass"; } -bool CSystemClass::loadSubsystems(string& strError, const CSubsystemPlugins* pSubsystemPlugins) +bool CSystemClass::loadSubsystems(string& strError, + const CSubsystemPlugins* pSubsystemPlugins, bool bVirtualSubsystemFallback) { - CAutoLog autoLlog_info(this, "Loading subsystem plugins"); + CAutoLog autoLog_info(this, "Loading subsystem plugins"); // Plugin list list<string> lstrPluginFiles; @@ -99,20 +101,13 @@ bool CSystemClass::loadSubsystems(string& strError, const CSubsystemPlugins* pSu // Fill Plugin files list lstrPluginFiles.push_back(strFolder + "/" + *it); } - - } - // Check at least one subsystem plugin available - if (!lstrPluginFiles.size()) { - - // No plugin found? - log_warning("No subsystem plugin found"); - - // Don't bail out now that we have virtual subsystems } // Start clean _pSubsystemLibrary->clean(); + list<string> lstrError; + bool bLoadPluginsSuccess = true; // Actually load plugins while (lstrPluginFiles.size()) { @@ -122,23 +117,33 @@ bool CSystemClass::loadSubsystems(string& strError, const CSubsystemPlugins* pSu // process failed to load at least one of them // Attempt to load the complete list - if (!loadPlugins(lstrPluginFiles, strError)) { + if (!loadPlugins(lstrPluginFiles, lstrError)) { - // Display the list of plugins we were unable to load - - // Leave clean - _pSubsystemLibrary->clean(); - - return false; + // Unable to load at least one plugin + break; } } - log_info("All subsystem plugins successfully loaded"); + + if (lstrPluginFiles.empty()) { + log_info("All subsystem plugins successfully loaded"); + } else { + // Log plugin as warning if fallback available, error otherwise + log_table(bVirtualSubsystemFallback, lstrError); + } + if (!bVirtualSubsystemFallback) { + // Any problem reported is an error as there is no fallback. + // Fill strError for caller. + CUtility::asString(lstrError, strError); + } // Add virtual subsystem builder _pSubsystemLibrary->addElementBuilder("Virtual", new TNamedElementBuilderTemplate<CVirtualSubsystem>()); - return true; + // Set virtual subsytem as builder fallback + _pSubsystemLibrary->enableDefaultMechanism(bVirtualSubsystemFallback); + + return bLoadPluginsSuccess || bVirtualSubsystemFallback; } // Plugin symbol computation @@ -165,11 +170,11 @@ string CSystemClass::getPluginSymbol(const string& strPluginPath) } // Plugin loading -bool CSystemClass::loadPlugins(list<string>& lstrPluginFiles, string& strError) +bool CSystemClass::loadPlugins(list<string>& lstrPluginFiles, list<string>& lstrError) { assert(lstrPluginFiles.size()); - bool bAtLeastOneSybsystemPluginSuccessfullyLoaded = false; + bool bAtLeastOneSubsystemPluginSuccessfullyLoaded = false; list<string>::iterator it = lstrPluginFiles.begin(); @@ -185,7 +190,7 @@ bool CSystemClass::loadPlugins(list<string>& lstrPluginFiles, string& strError) if (!lib_handle) { // Failed - log_warning("Plugin load failed: %s, proceeding on with remaining ones", dlerror()); + lstrError.push_back("Plugin load failed: " + string(dlerror())); // Next plugin ++it; @@ -201,36 +206,23 @@ bool CSystemClass::loadPlugins(list<string>& lstrPluginFiles, string& strError) if (!pfnGetSubsystemBuilder) { - strError = "Subsystem plugin " + strPluginFileName + " does not contain " + strPluginSymbol + " symbol."; + lstrError.push_back("Subsystem plugin " + strPluginFileName + + " does not contain " + strPluginSymbol + " symbol."); - return false; + continue; } + // Account for this success + bAtLeastOneSubsystemPluginSuccessfullyLoaded = true; + // Fill library pfnGetSubsystemBuilder(_pSubsystemLibrary); - // Account for this success - bAtLeastOneSybsystemPluginSuccessfullyLoaded = true; - // Remove successfully loaded plugin from list and select next lstrPluginFiles.erase(it++); } - // Check for success - if (!bAtLeastOneSybsystemPluginSuccessfullyLoaded) { - - // Return list of plugins we were unable to load - strError = "Unable to load the following plugins:\n"; - - for (it = lstrPluginFiles.begin(); it != lstrPluginFiles.end(); ++it) { - - strError += *it + "\n"; - } - - return false; - } - - return true; + return bAtLeastOneSubsystemPluginSuccessfullyLoaded; } const CSubsystemLibrary* CSystemClass::getSubsystemLibrary() const diff --git a/parameter/SystemClass.h b/parameter/SystemClass.h index 5bc9006..3ff80e4 100644 --- a/parameter/SystemClass.h +++ b/parameter/SystemClass.h @@ -1,8 +1,8 @@ -/* +/* * INTEL CONFIDENTIAL - * Copyright © 2011 Intel + * Copyright © 2011 Intel * Corporation All Rights Reserved. - * + * * The source code contained or described herein and all documents related to * the source code ("Material") are owned by Intel Corporation or its suppliers * or licensors. Title to the Material remains with Intel Corporation or its @@ -12,13 +12,13 @@ * treaty provisions. No part of the Material may be used, copied, reproduced, * modified, published, uploaded, posted, transmitted, distributed, or * disclosed in any way without Intel’s prior express written permission. - * + * * No license under any patent, copyright, trade secret or other intellectual * property right is granted to or conferred upon you by disclosure or delivery * of the Materials, either expressly, by implication, inducement, estoppel or * otherwise. Any license under such intellectual property rights must be * express and approved by Intel in writing. - * + * * CREATED: 2011-06-01 * UPDATED: 2011-07-27 */ @@ -36,8 +36,18 @@ public: CSystemClass(); virtual ~CSystemClass(); - // Called from parent before actual init - bool loadSubsystems(string& strError, const CSubsystemPlugins* pSubsystemPlugins); + /** Load subsystem plugin and fill the corresponding libraries. + * + * @param[out] strError is filled with new line separated errors if the function returns false, + * undefined otherwise. + * @param[in] pSubsystemPlugins The plugins to load. + * @param[in] bVirtualSubsystemFallback If a subsystem can not be found, use the virtual one. + * + * @return true if the plugins succesfully started or that a fallback is available, + false otherwise. + */ + bool loadSubsystems(string& strError, const CSubsystemPlugins* pSubsystemPlugins, + bool bVirtualSubsystemFallback = false); // Subsystem factory const CSubsystemLibrary* getSubsystemLibrary() const; @@ -68,14 +78,18 @@ private: // base virtual bool childrenAreDynamic() const; - // Subsystem plugins - bool getPluginFiles(const string& strPluginPath, list<string>& lstrPluginFiles) const; - // Plugin symbol computation static string getPluginSymbol(const string& strPluginPath); - // Plugin loading - bool loadPlugins(list<string>& lstrPluginFiles, string& strError); + /** Load subsystem plugin shared libraries. + * + * @param[in:out] lstrPluginFiles is the path list of the plugins shared libraries to load. + * Successfully loaded plugins are removed from the list. + * @param[out] lstrError is the list of error that occured during loadings. + * + * @return true if at least one plugin has been succesfully loaded, false otherwise. + */ + bool loadPlugins(list<string>& lstrPluginFiles, list<string>& lstrError); // Subsystem factory CSubsystemLibrary* _pSubsystemLibrary; |