diff options
author | Artem Nosach <ANosach@luxoft.com> | 2015-06-08 12:14:03 +0300 |
---|---|---|
committer | Artem Nosach <ANosach@luxoft.com> | 2015-06-23 17:09:16 +0300 |
commit | 4e7ee0a886c3dad56a49293f98a2324b3d148a6f (patch) | |
tree | 2644ff0d75edd17fa2a7de1b8831822156f3f3e6 /src/3rd_party-static | |
parent | 9e15ae233de81a4aac923d706225a5b605d3fe11 (diff) | |
download | sdl_core-4e7ee0a886c3dad56a49293f98a2324b3d148a6f.tar.gz |
Make message broker thread safety.
Diffstat (limited to 'src/3rd_party-static')
-rw-r--r-- | src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp | 3 | ||||
-rw-r--r-- | src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp | 74 |
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 55550eab3a..b4c5376621 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 2d55cecd67..278821c8a2 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; |