Close all dynamic libraries when PFW is destroyed

BZ: 159294

The PFW opens many dynamic libs but does not keep any track of them.
This prevents to close them cleanly and have border effect when trying
to do coverage measurement.

The patch ensures that the PFW closes its libraries when destroyed.

Change-Id: Idd1f69bfbc719e8e000914bef990c809ec5ed206
Signed-off-by: Renaud de Chivre <renaud.de.chivre@intel.com>
diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp
index a07cc57..88270c5 100644
--- a/parameter/ParameterMgr.cpp
+++ b/parameter/ParameterMgr.cpp
@@ -276,6 +276,7 @@
     _pElementLibrarySet(new CElementLibrarySet),
     _strXmlConfigurationFilePath(strConfigurationFilePath),
     _pSubsystemPlugins(NULL),
+    _handleLibRemoteProcessor(NULL),
     _uiStructureChecksum(0),
     _pRemoteProcessorServer(NULL),
     _uiMaxCommandUsageLength(0),
@@ -332,6 +333,11 @@
     delete _pMainParameterBlackboard;
     delete _pElementLibrarySet;
 
+    // Close remote processor library
+    if (_handleLibRemoteProcessor != NULL) {
+        dlclose(_handleLibRemoteProcessor);
+    }
+
     // Tuning Mode Mutex
     pthread_mutex_destroy(&_blackboardMutex);
 }
@@ -2195,9 +2201,9 @@
         log_info("Loading remote processor library");
 
         // Load library
-        void* lib_handle = dlopen("libremote-processor.so", RTLD_NOW);
+        _handleLibRemoteProcessor = dlopen("libremote-processor.so", RTLD_NOW);
 
-        if (!lib_handle) {
+        if (!_handleLibRemoteProcessor) {
 
             // Return error
             const char* pcError = dlerror();
@@ -2213,7 +2219,7 @@
             return false;
         }
 
-        CreateRemoteProcessorServer pfnCreateRemoteProcessorServer = (CreateRemoteProcessorServer)dlsym(lib_handle, "createRemoteProcessorServer");
+        CreateRemoteProcessorServer pfnCreateRemoteProcessorServer = (CreateRemoteProcessorServer)dlsym(_handleLibRemoteProcessor, "createRemoteProcessorServer");
 
         if (!pfnCreateRemoteProcessorServer) {
 
diff --git a/parameter/ParameterMgr.h b/parameter/ParameterMgr.h
index 1f738fe..d152a85 100644
--- a/parameter/ParameterMgr.h
+++ b/parameter/ParameterMgr.h
@@ -466,6 +466,9 @@
     // Subsystem plugin location
     const CSubsystemPlugins* _pSubsystemPlugins;
 
+    // Remote processor library handle
+    void *_handleLibRemoteProcessor;
+
     // Whole system structure checksum
     uint8_t _uiStructureChecksum;
 
diff --git a/parameter/SystemClass.cpp b/parameter/SystemClass.cpp
index 14db767..bd87cb2 100644
--- a/parameter/SystemClass.cpp
+++ b/parameter/SystemClass.cpp
@@ -62,6 +62,13 @@
 CSystemClass::~CSystemClass()
 {
     delete _pSubsystemLibrary;
+
+    // Close all previously opened libraries
+    while (!_subsystemLibraries.empty())
+    {
+      dlclose(_subsystemLibraries.back());
+      _subsystemLibraries.pop_back();
+    }
 }
 
 bool CSystemClass::childrenAreDynamic() const
@@ -216,6 +223,9 @@
             continue;
         }
 
+        // Store libraries handles
+        _subsystemLibraries.push_back(lib_handle);
+
         // Get plugin symbol
         string strPluginSymbol = getPluginSymbol(strPluginFileName);
 
diff --git a/parameter/SystemClass.h b/parameter/SystemClass.h
index ee71e5f..37d270a 100644
--- a/parameter/SystemClass.h
+++ b/parameter/SystemClass.h
@@ -105,5 +105,6 @@
 
     // Subsystem factory
     CSubsystemLibrary* _pSubsystemLibrary;
+    list<void*> _subsystemLibraries; /**< Contains the list of all open plugin libs. */
 };