diff options
author | agaliuzov <agaliuzov@luxoft.com> | 2016-03-24 17:32:44 +0200 |
---|---|---|
committer | agaliuzov <agaliuzov@luxoft.com> | 2016-03-24 17:32:44 +0200 |
commit | d1fcbfbd5c56f2f9b206932224f89ff03d608591 (patch) | |
tree | 5e3ec2ace08baf87a765f4d9e458a0529324ca8d /src/components/connection_handler | |
parent | e84d3b5048e653c466f9daef301cb77578651d13 (diff) | |
parent | ea2eaa6a2ac6b4ce59aa3f8e89086aaff1db08b0 (diff) | |
download | sdl_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.h | 2 | ||||
-rw-r--r-- | src/components/connection_handler/src/connection_handler_impl.cc | 65 |
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(); |