summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Nosach <ANosach@luxoft.com>2015-06-08 12:14:03 +0300
committerArtem Nosach <ANosach@luxoft.com>2015-06-23 17:09:16 +0300
commit4e7ee0a886c3dad56a49293f98a2324b3d148a6f (patch)
tree2644ff0d75edd17fa2a7de1b8831822156f3f3e6
parent9e15ae233de81a4aac923d706225a5b605d3fe11 (diff)
downloadsmartdevicelink-4e7ee0a886c3dad56a49293f98a2324b3d148a6f.tar.gz
Make message broker thread safety.
-rw-r--r--src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp3
-rw-r--r--src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp74
2 files changed, 56 insertions, 21 deletions
diff --git a/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp b/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp
index 55550eab3..b4c537662 100644
--- a/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp
+++ b/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp
@@ -5,6 +5,7 @@
#include <vector>
#include <iostream>
#include <string>
+#include "utils/lock.h"
/**
* \namespace NsMessageBroker
@@ -91,12 +92,14 @@ namespace NsMessageBroker
* For example PhoneController:1080
*/
std::map <std::string, int> mControllersList;
+ sync_primitives::Lock mControllersListLock;
/**
* \brief Map to store subscribers information like ComponentName.PropertyName:socketFd:.
* For example PhoneController.onPhoneBookChanged:1080
*/
std::multimap <std::string, int> mSubscribersList;
+ sync_primitives::Lock mSubscribersListLock;
};
} /* namespace NsMessageBroker */
diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp b/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp
index 2d55cecd6..278821c8a 100644
--- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp
+++ b/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp
@@ -32,6 +32,8 @@ namespace NsMessageBroker
DBG_MSG(("CMessageBrokerRegistry::addController()\n"));
bool result = false;
std::map <std::string, int>::iterator it;
+
+ sync_primitives::AutoLock lock(mControllersListLock);
it = mControllersList.find(name);
if (it == mControllersList.end())
{
@@ -41,6 +43,7 @@ namespace NsMessageBroker
{
DBG_MSG(("Controller already exists!\n"));
}
+
DBG_MSG(("Count of controllers: %d\n", mControllersList.size()));
return result;
}
@@ -49,43 +52,62 @@ namespace NsMessageBroker
{
DBG_MSG(("CMessageBrokerRegistry::deleteController()\n"));
std::map <std::string, int>::iterator it;
- it = mControllersList.find(name);
- if (it != mControllersList.end())
+
+ int fd;
{
- int fd = it->second;
- mControllersList.erase(it);
- std::multimap <std::string, int>::iterator it_s = mSubscribersList.begin();
- for (; it_s !=mSubscribersList.end(); ) {
- if (it_s->second == fd) {
- mSubscribersList.erase(it_s++);
- } else {
- ++it_s;
- }
+ sync_primitives::AutoLock controllers_lock(mControllersListLock);
+ it = mControllersList.find(name);
+ if (it != mControllersList.end())
+ {
+ fd = it->second;
+ mControllersList.erase(it);
+ } else {
+ DBG_MSG(("No such controller in the list!\n"));
+ return;
+ }
+ DBG_MSG(("Count of controllers: %d\n", mControllersList.size()));
+ }
+
+ sync_primitives::AutoLock subscribers_lock(mSubscribersListLock);
+ std::multimap <std::string, int>::iterator it_s = mSubscribersList.begin();
+ for (; it_s !=mSubscribersList.end(); ) {
+ if (it_s->second == fd) {
+ mSubscribersList.erase(it_s++);
+ } else {
+ ++it_s;
}
- } else
- {
- DBG_MSG(("No such controller in the list!\n"));
}
- DBG_MSG(("Count of controllers: %d\n", mControllersList.size()));
}
void CMessageBrokerRegistry::removeControllersByDescriptor(const int fd) {
DBG_MSG(("CMessageBrokerRegistry::removeControllersByDescriptor(%d)\n",
fd));
- std::map <std::string, int>::iterator it = mControllersList.begin();
- while(it != mControllersList.end()) {
- if (it->second == fd) {
- deleteController((it++)->first);
- } else {
- ++it;
+ std::vector<std::string> controllers_to_delete;
+ {
+ sync_primitives::AutoLock controllers_lock(mControllersListLock);
+ std::map <std::string, int>::iterator it = mControllersList.begin();
+ for (; it != mControllersList.end();) {
+ if (it->second == fd) {
+ controllers_to_delete.push_back((it++)->first);
+ } else {
+ ++it;
+ }
}
}
+
+ std::vector<std::string>::iterator delete_it =
+ controllers_to_delete.begin();
+ for (; controllers_to_delete.end() != delete_it; ++delete_it) {
+ deleteController(*delete_it);
+ }
}
bool CMessageBrokerRegistry::addSubscriber(int fd, std::string name)
{
DBG_MSG(("CMessageBrokerRegistry::addSubscriber()\n"));
bool result = true;
+
+ sync_primitives::AutoLock lock(mSubscribersListLock);
std::pair<std::multimap <std::string, int>::iterator, std::multimap <std::string, int>::iterator> p = mSubscribersList.equal_range(name);
if (p.first != p.second)
{
@@ -103,6 +125,7 @@ namespace NsMessageBroker
{
mSubscribersList.insert(std::map <std::string, int>::value_type(name, fd));
}
+
DBG_MSG(("Count of subscribers: %d\n", mSubscribersList.size()));
return result;
}
@@ -110,6 +133,8 @@ namespace NsMessageBroker
void CMessageBrokerRegistry::deleteSubscriber(int fd, std::string name)
{
DBG_MSG(("CMessageBrokerRegistry::deleteSubscriber()\n"));
+
+ sync_primitives::AutoLock lock(mSubscribersListLock);
std::pair<std::multimap <std::string, int>::iterator, std::multimap <std::string, int>::iterator> p = mSubscribersList.equal_range(name);
if (p.first != p.second) {
std::multimap <std::string, int>::iterator itr;
@@ -122,6 +147,7 @@ namespace NsMessageBroker
}
}
}
+
DBG_MSG(("Count of subscribers: %d\n", mSubscribersList.size()));
}
@@ -130,11 +156,14 @@ namespace NsMessageBroker
DBG_MSG(("CMessageBrokerRegistry::getDestinationFd()\n"));
int result = -1;
std::map <std::string, int>::iterator it;
+
+ sync_primitives::AutoLock lock(mControllersListLock);
it = mControllersList.find(name);
if (it != mControllersList.end())
{
result = it->second;
}
+
DBG_MSG(("Controllers Fd: %d\n", result));
return result;
}
@@ -144,6 +173,8 @@ namespace NsMessageBroker
DBG_MSG(("CMessageBrokerRegistry::getSubscribersFd()\n"));
int res = 0;
std::map <std::string, int>::iterator it;
+
+ sync_primitives::AutoLock lock(mSubscribersListLock);
std::pair<std::multimap <std::string, int>::iterator, std::multimap <std::string, int>::iterator> p = mSubscribersList.equal_range(name);
if (p.first != p.second)
{
@@ -154,6 +185,7 @@ namespace NsMessageBroker
DBG_MSG(("Controllers Fd: %d\n", itr->second));
}
}
+
res = result.size();
DBG_MSG(("Result vector size: %d\n", res));
return res;