[NetworkBearerSelection] - securing pointers of each instances with a mutex
authorAndrzej Popowski <a.popowski@samsung.com>
Tue, 21 Apr 2015 13:11:32 +0000 (15:11 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Fri, 24 Apr 2015 12:06:29 +0000 (21:06 +0900)
Change-Id: Id3dc9df14f4505784afe0fed9e72bcf29506c66a
Signed-off-by: Andrzej Popowski <a.popowski@samsung.com>
src/networkbearerselection/networkbearerselection_instance.cc
src/networkbearerselection/networkbearerselection_manager.cc
src/networkbearerselection/networkbearerselection_manager.h

index aefbf9cf755cb38334b417f4b677551b6baf648b..5375113c2bd84f9e211f64c96366feab4ee676a7 100644 (file)
@@ -45,7 +45,9 @@ NetworkBearerSelectionInstance::NetworkBearerSelectionInstance() {
   NetworkBearerSelectionManager::GetInstance()->AddListener(this);
 }
 
-NetworkBearerSelectionInstance::~NetworkBearerSelectionInstance() {}
+NetworkBearerSelectionInstance::~NetworkBearerSelectionInstance() {
+  NetworkBearerSelectionManager::GetInstance()->RemoveListener(this);
+}
 
 #define CHECK_EXIST(args, name, out)                                       \
   if (!args.contains(name)) {                                              \
index 316802d78da3f32f351fb38bb62930def13db833..6879bc2b69e3247afe852c8394160472b2bce99e 100644 (file)
@@ -32,9 +32,16 @@ struct NetworkBearerSelectionReleaseEvent {
 
 void NetworkBearerSelectionManager::AddListener(
     NetworkBearerSelectionListener* listener) {
+  std::lock_guard<std::mutex> lock(m_mutex);
   m_listeners.push_back(listener);
 }
 
+void NetworkBearerSelectionManager::RemoveListener(
+    NetworkBearerSelectionListener* listener) {
+  std::lock_guard<std::mutex> lock(m_mutex);
+  m_listeners.remove(listener);
+}
+
 NetworkBearerSelectionManager* NetworkBearerSelectionManager::GetInstance() {
   static NetworkBearerSelectionManager instance;
   return &instance;
@@ -377,6 +384,7 @@ void NetworkBearerSelectionManager::deregistStateChangeListener(
 void NetworkBearerSelectionManager::makeSuccessCallback(
     const std::string& domain_name) {
   LoggerD("enter");
+  std::lock_guard<std::mutex> lock(m_mutex);
   for (NetworkBearerSelectionListener* listener : m_listeners)
     listener->onNBSSuccess(domain_name);
 }
@@ -393,6 +401,7 @@ void NetworkBearerSelectionManager::makeErrorCallback(
     const std::string& domain_name,
     const std::string& info) {
   LoggerD("enter");
+  std::lock_guard<std::mutex> lock(m_mutex);
   for (NetworkBearerSelectionListener* listener : m_listeners)
     listener->onNBSError(domain_name, info);
 }
@@ -400,6 +409,7 @@ void NetworkBearerSelectionManager::makeErrorCallback(
 void NetworkBearerSelectionManager::makeDisconnectCallback(
     const std::string& domain_name) {
   LoggerD("enter");
+  std::lock_guard<std::mutex> lock(m_mutex);
   for (NetworkBearerSelectionListener* listener : m_listeners)
     listener->onNBSDisconnect(domain_name);
 }
index 863a71b7bf377fe2e9838ff8ea74907cf8d28dbf..42487ce58efc0c351ba740f05701a378f76ab00f 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <string>
 #include <list>
+#include <mutex>
 #include <functional>
 #include <device/callback.h>
 #include <net_connection.h>
@@ -38,6 +39,7 @@ class NetworkBearerSelectionManager {
  public:
   typedef std::function<void(bool)> ReleaseReplyCallback;
   void AddListener(NetworkBearerSelectionListener* listener);
+  void RemoveListener(NetworkBearerSelectionListener* listener);
 
   void requestRouteToHost(const std::string& domain_name);
   bool releaseRouteToHost(const std::string& domain_name,
@@ -79,6 +81,7 @@ class NetworkBearerSelectionManager {
   std::list<std::string> m_domainNames;
   ConnectionState m_connectionState;
   bool m_isConnectionOpen;
+  std::mutex m_mutex;
 };
 
 }  // namespace networkbearerselection