From 3838a2370b47d50424df851f5450ba1166189406 Mon Sep 17 00:00:00 2001 From: Andrzej Popowski Date: Tue, 21 Apr 2015 15:11:32 +0200 Subject: [PATCH] [NetworkBearerSelection] - securing pointers of each instances with a mutex Change-Id: Id3dc9df14f4505784afe0fed9e72bcf29506c66a Signed-off-by: Andrzej Popowski --- .../networkbearerselection_instance.cc | 4 +++- .../networkbearerselection_manager.cc | 10 ++++++++++ .../networkbearerselection_manager.h | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/networkbearerselection/networkbearerselection_instance.cc b/src/networkbearerselection/networkbearerselection_instance.cc index aefbf9cf..5375113c 100644 --- a/src/networkbearerselection/networkbearerselection_instance.cc +++ b/src/networkbearerselection/networkbearerselection_instance.cc @@ -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)) { \ diff --git a/src/networkbearerselection/networkbearerselection_manager.cc b/src/networkbearerselection/networkbearerselection_manager.cc index 316802d7..6879bc2b 100644 --- a/src/networkbearerselection/networkbearerselection_manager.cc +++ b/src/networkbearerselection/networkbearerselection_manager.cc @@ -32,9 +32,16 @@ struct NetworkBearerSelectionReleaseEvent { void NetworkBearerSelectionManager::AddListener( NetworkBearerSelectionListener* listener) { + std::lock_guard lock(m_mutex); m_listeners.push_back(listener); } +void NetworkBearerSelectionManager::RemoveListener( + NetworkBearerSelectionListener* listener) { + std::lock_guard 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 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 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 lock(m_mutex); for (NetworkBearerSelectionListener* listener : m_listeners) listener->onNBSDisconnect(domain_name); } diff --git a/src/networkbearerselection/networkbearerselection_manager.h b/src/networkbearerselection/networkbearerselection_manager.h index 863a71b7..42487ce5 100644 --- a/src/networkbearerselection/networkbearerselection_manager.h +++ b/src/networkbearerselection/networkbearerselection_manager.h @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -38,6 +39,7 @@ class NetworkBearerSelectionManager { public: typedef std::function 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 m_domainNames; ConnectionState m_connectionState; bool m_isConnectionOpen; + std::mutex m_mutex; }; } // namespace networkbearerselection -- 2.34.1