summaryrefslogtreecommitdiff
path: root/src/components/connection_handler
diff options
context:
space:
mode:
authoragaliuzov <agaliuzov@luxoft.com>2016-03-24 17:32:44 +0200
committeragaliuzov <agaliuzov@luxoft.com>2016-03-24 17:32:44 +0200
commitd1fcbfbd5c56f2f9b206932224f89ff03d608591 (patch)
tree5e3ec2ace08baf87a765f4d9e458a0529324ca8d /src/components/connection_handler
parente84d3b5048e653c466f9daef301cb77578651d13 (diff)
parentea2eaa6a2ac6b4ce59aa3f8e89086aaff1db08b0 (diff)
downloadsdl_core-d1fcbfbd5c56f2f9b206932224f89ff03d608591.tar.gz
Merge remote-tracking branch 'upstream/master' into develop
Diffstat (limited to 'src/components/connection_handler')
-rw-r--r--src/components/connection_handler/include/connection_handler/connection_handler_impl.h2
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc65
2 files changed, 39 insertions, 28 deletions
diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h
index 71d51e48b1..b6b13b57c1 100644
--- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h
+++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h
@@ -451,7 +451,7 @@ class ConnectionHandlerImpl : public ConnectionHandler,
* \brief Lock for applications list
*/
mutable sync_primitives::RWLock connection_list_lock_;
- mutable sync_primitives::Lock connection_handler_observer_lock_;
+ mutable sync_primitives::RWLock connection_handler_observer_lock_;
/**
* \brief Cleans connection list on destruction
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index 261a8d232c..e962da7b19 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -67,7 +67,8 @@ ConnectionHandlerImpl::ConnectionHandlerImpl(
, connection_handler_observer_(NULL)
, transport_manager_(tm)
, protocol_handler_(NULL)
- , connection_handler_observer_lock_(true)
+ , connection_list_lock_()
+ , connection_handler_observer_lock_()
, connection_list_deleter_(&connection_list_) {
}
@@ -88,7 +89,7 @@ void ConnectionHandlerImpl::set_connection_handler_observer(
ConnectionHandlerObserver *observer) {
LOG4CXX_DEBUG(logger_, "ConnectionHandlerImpl::set_connection_handler_observer() "
<< observer);
- sync_primitives::AutoLock lock(connection_handler_observer_lock_);
+ sync_primitives::AutoWriteLock write_lock(connection_handler_observer_lock_);
if (!observer) {
LOG4CXX_WARN(logger_, "Set Null pointer to observer.");
}
@@ -108,14 +109,14 @@ void ConnectionHandlerImpl::set_protocol_handler(
void ConnectionHandlerImpl::OnDeviceListUpdated(
const std::vector<transport_manager::DeviceInfo>&) {
LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock lock(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
connection_handler_observer_->OnDeviceListUpdated(device_list_);
}
}
void ConnectionHandlerImpl::OnFindNewApplicationsRequest() {
- sync_primitives::AutoLock lock(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
connection_handler_observer_->OnFindNewApplicationsRequest();
}
@@ -134,6 +135,10 @@ void ConnectionHandlerImpl::OnDeviceAdded(
device_info.device_handle(),
Device(device_info.device_handle(), device_info.name(),
device_info.mac_address(), device_info.connection_type())));
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
+ if (connection_handler_observer_) {
+ connection_handler_observer_->OnDeviceListUpdated(device_list_);
+ }
}
void ConnectionHandlerImpl::OnDeviceRemoved(
@@ -162,7 +167,7 @@ void ConnectionHandlerImpl::OnDeviceRemoved(
}
device_list_.erase(device_info.device_handle());
- sync_primitives::AutoLock lock(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
connection_handler_observer_->RemoveDevice(device_info.device_handle());
}
@@ -314,7 +319,7 @@ uint32_t ConnectionHandlerImpl::OnSessionStartedCallback(
*hash_id = protocol_handler::HASH_ID_NOT_SUPPORTED;
}
}
- sync_primitives::AutoLock lock2(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
const uint32_t session_key = KeyFromPair(connection_handle, new_session_id);
const bool success = connection_handler_observer_->OnServiceStartedCallback(
@@ -408,7 +413,7 @@ uint32_t ConnectionHandlerImpl::OnSessionEndedCallback(
}
}
- sync_primitives::AutoLock lock2(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
connection_handler_observer_->OnServiceEndedCallback(
session_key, service_type, CloseSessionReason::kCommon);
@@ -645,7 +650,7 @@ void ConnectionHandlerImpl::StartDevicesDiscovery() {
LOG4CXX_AUTO_TRACE(logger_);
transport_manager_.SearchDevices();
- sync_primitives::AutoLock lock(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
connection_handler_observer_->OnDeviceListUpdated(device_list_);
}
@@ -763,26 +768,32 @@ void ConnectionHandlerImpl::CloseSession(ConnectionHandle connection_handle,
}
}
- if (connection_handler_observer_) {
- SessionMap::const_iterator session_map_itr = session_map.find(session_id);
- if (session_map_itr != session_map.end()) {
- const uint32_t session_key = KeyFromPair(connection_id, session_id);
- const Session &session = session_map_itr->second;
- const ServiceList &service_list = session.service_list;
-
- ServiceList::const_reverse_iterator service_list_itr = service_list.rbegin();
- for (;service_list_itr != service_list.rend(); ++service_list_itr) {
- const protocol_handler::ServiceType service_type =
- service_list_itr->service_type;
- connection_handler_observer_->OnServiceEndedCallback(session_key,
- service_type,
- close_reason);
- }
- } else {
- LOG4CXX_ERROR(logger_, "Session with id: " << session_id << " not found");
- return;
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
+ if (!connection_handler_observer_) {
+ LOG4CXX_ERROR(logger_, "Connection handler observer not found");
+ return;
+ }
+
+
+ SessionMap::const_iterator session_map_itr = session_map.find(session_id);
+ if (session_map_itr != session_map.end()) {
+ const uint32_t session_key = KeyFromPair(connection_id, session_id);
+ const Session &session = session_map_itr->second;
+ const ServiceList &service_list = session.service_list;
+
+ ServiceList::const_reverse_iterator service_list_itr = service_list.rbegin();
+ for (;service_list_itr != service_list.rend(); ++service_list_itr) {
+ const protocol_handler::ServiceType service_type =
+ service_list_itr->service_type;
+ connection_handler_observer_->OnServiceEndedCallback(session_key,
+ service_type,
+ close_reason);
}
+ } else {
+ LOG4CXX_ERROR(logger_, "Session with id: " << session_id << " not found");
+ return;
}
+
LOG4CXX_DEBUG(logger_, "Session with id: " << session_id << " has been closed successfully");
}
@@ -896,7 +907,7 @@ void ConnectionHandlerImpl::OnConnectionEnded(
connection_list_.erase(itr);
connection_list_lock_.Release();
- sync_primitives::AutoLock lock2(connection_handler_observer_lock_);
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_ && connection.get() != NULL) {
const SessionMap session_map = connection->session_map();