diff options
author | AKalinich-Luxoft <AKalinich@luxoft.com> | 2017-12-14 16:21:58 +0200 |
---|---|---|
committer | AKalinich-Luxoft <AKalinich@luxoft.com> | 2017-12-22 13:41:53 +0200 |
commit | 68fdb3a280212d9b6971cf23648f7dd0ab5688d5 (patch) | |
tree | eb16af9c4b674760bdf78f2d3eaa9f0b61b15dab | |
parent | df9e8cc6268570e2627c40cf6085dd36944784bc (diff) | |
download | sdl_core-68fdb3a280212d9b6971cf23648f7dd0ab5688d5.tar.gz |
Added check if HB tracking for session is already enabled
This prevents SDL from starting HB session tracking every
time SDL receives HB request from mobile.
10 files changed, 74 insertions, 8 deletions
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index c4779dcbfc..71978b6d56 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -573,12 +573,6 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( message[strings::params][strings::protocol_version].asInt()); application->set_protocol_version(protocol_version); - if (protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_UNKNOWN != - protocol_version) { - connection_handler().BindProtocolVersionWithSession( - connection_key, static_cast<uint8_t>(protocol_version)); - } - // Keep HMI add id in case app is present in "waiting for registration" list apps_to_register_list_lock_.Acquire(); AppsWaitRegistrationSet::iterator it = apps_to_register_.find(application); diff --git a/src/components/connection_handler/include/connection_handler/connection.h b/src/components/connection_handler/include/connection_handler/connection.h index bd5858c4cd..11515ca7ae 100644 --- a/src/components/connection_handler/include/connection_handler/connection.h +++ b/src/components/connection_handler/include/connection_handler/connection.h @@ -229,6 +229,14 @@ class Connection { void KeepAlive(uint8_t session_id); /** + * @brief Check is heartbeat monitoring started for specified session + * @param session_id session id + * @return returns true if heartbeat monitoring started for specified session + * otherwise returns false + */ + bool IsSessionHeartbeatTracked(const uint8_t session_id) const; + + /** * @brief Start heartbeat for specified session * @param session_id session id */ 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 aebc612a22..d4962c23d8 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 @@ -400,6 +400,14 @@ class ConnectionHandlerImpl void SendEndService(uint32_t key, uint8_t service_type) OVERRIDE; /** + * @brief Check is heartbeat monitoring started for specified connection key + * @param connection_key pair of connection and session id + * @return returns true if heartbeat monitoring started for specified + * connection key otherwise returns false + */ + bool IsSessionHeartbeatTracked(const uint32_t connection_key) const OVERRIDE; + + /** * \brief Start heartbeat for specified session * * \param connection_key pair of connection and session id diff --git a/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h b/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h index 4d1d07112c..d5ee0946ff 100644 --- a/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h +++ b/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h @@ -69,6 +69,14 @@ class HeartBeatMonitor : public threads::ThreadDelegate { void KeepAlive(uint8_t session_id); /** + * @brief Check is heartbeat monitoring started for specified session + * @param session_id session id + * @return returns true if heartbeat monitoring started for specified session + * otherwise returns false + */ + bool IsSessionHeartbeatTracked(const uint8_t session_id) const; + + /** * \brief Thread exit procedure. */ virtual void exitThreadMain(); @@ -111,7 +119,7 @@ class HeartBeatMonitor : public threads::ThreadDelegate { typedef std::map<uint8_t, SessionState> SessionMap; SessionMap sessions_; - sync_primitives::Lock sessions_list_lock_; // recurcive + mutable sync_primitives::Lock sessions_list_lock_; // recurcive sync_primitives::Lock main_thread_lock_; mutable sync_primitives::Lock heartbeat_timeout_seconds_lock_; sync_primitives::ConditionalVariable heartbeat_monitor_; diff --git a/src/components/connection_handler/src/connection.cc b/src/components/connection_handler/src/connection.cc index 202736e612..c4088470c8 100644 --- a/src/components/connection_handler/src/connection.cc +++ b/src/components/connection_handler/src/connection.cc @@ -369,6 +369,10 @@ bool Connection::ProtocolVersion(uint8_t session_id, return true; } +bool Connection::IsSessionHeartbeatTracked(const uint8_t session_id) const { + return heartbeat_monitor_->IsSessionHeartbeatTracked(session_id); +} + void Connection::StartHeartBeat(uint8_t session_id) { heartbeat_monitor_->AddSession(session_id); } diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index bd5b3d79bb..0b637a0288 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -1069,6 +1069,21 @@ void ConnectionHandlerImpl::SendEndService(uint32_t key, uint8_t service_type) { } } +bool ConnectionHandlerImpl::IsSessionHeartbeatTracked( + const uint32_t connection_key) const { + LOG4CXX_AUTO_TRACE(logger_); + uint32_t connection_handle = 0; + uint8_t session_id = 0; + PairFromKey(connection_key, &connection_handle, &session_id); + + sync_primitives::AutoReadLock lock(connection_list_lock_); + ConnectionList::const_iterator it = connection_list_.find(connection_handle); + if (connection_list_.end() != it) { + return it->second->IsSessionHeartbeatTracked(session_id); + } + return false; +} + void ConnectionHandlerImpl::StartSessionHeartBeat(uint32_t connection_key) { LOG4CXX_AUTO_TRACE(logger_); uint32_t connection_handle = 0; diff --git a/src/components/connection_handler/src/heartbeat_monitor.cc b/src/components/connection_handler/src/heartbeat_monitor.cc index 15ca2cfca8..677bab6aa3 100644 --- a/src/components/connection_handler/src/heartbeat_monitor.cc +++ b/src/components/connection_handler/src/heartbeat_monitor.cc @@ -142,6 +142,14 @@ void HeartBeatMonitor::KeepAlive(uint8_t session_id) { } } +bool HeartBeatMonitor::IsSessionHeartbeatTracked( + const uint8_t session_id) const { + LOG4CXX_AUTO_TRACE(logger_); + AutoLock auto_lock(sessions_list_lock_); + + return sessions_.end() != sessions_.find(session_id); +} + void HeartBeatMonitor::exitThreadMain() { // FIXME (dchmerev@luxoft.com): thread requested to stop should stop as soon // as possible, diff --git a/src/components/include/connection_handler/connection_handler.h b/src/components/include/connection_handler/connection_handler.h index c70861b5f6..3402dcae41 100644 --- a/src/components/include/connection_handler/connection_handler.h +++ b/src/components/include/connection_handler/connection_handler.h @@ -130,6 +130,15 @@ class ConnectionHandler { virtual void SendEndService(uint32_t key, uint8_t service_type) = 0; /** + * @brief Check is heartbeat monitoring started for specified connection key + * @param connection_key pair of connection and session id + * @return returns true if heartbeat monitoring started for specified + * connection key otherwise returns false + */ + virtual bool IsSessionHeartbeatTracked( + const uint32_t connection_key) const = 0; + + /** * \brief Start heartbeat for specified session * * \param connection_key pair of connection and session id diff --git a/src/components/include/test/connection_handler/mock_connection_handler.h b/src/components/include/test/connection_handler/mock_connection_handler.h index 5cb5f471b5..0933859089 100644 --- a/src/components/include/test/connection_handler/mock_connection_handler.h +++ b/src/components/include/test/connection_handler/mock_connection_handler.h @@ -75,6 +75,8 @@ class MockConnectionHandler : public connection_handler::ConnectionHandler { uint8_t session_id, CloseSessionReason close_reason)); MOCK_METHOD2(SendEndService, void(uint32_t key, uint8_t service_type)); + MOCK_CONST_METHOD1(IsSessionHeartbeatTracked, + bool(const uint32_t connection_key)); MOCK_METHOD1(StartSessionHeartBeat, void(uint32_t connection_key)); MOCK_METHOD2(SendHeartBeat, void(ConnectionHandle connection_handle, uint8_t session_id)); diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index a2a38c3bee..c9d9f56a63 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -309,6 +309,11 @@ void ProtocolHandlerImpl::SendStartSessionAck( raw_ford_messages_to_mobile_.PostMessage( impl::RawFordMessageToMobile(ptr, false)); + const uint32_t connection_key = + session_observer_.KeyFromPair(connection_id, session_id); + connection_handler_.BindProtocolVersionWithSession(connection_key, + ack_protocol_version); + LOG4CXX_DEBUG(logger_, "SendStartSessionAck() for connection " << connection_id << " for service_type " @@ -1701,7 +1706,12 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( protocol_version <= PROTOCOL_VERSION_5) { const uint32_t connection_key = session_observer_.KeyFromPair(connection_id, session_id); - connection_handler_.StartSessionHeartBeat(connection_key); + if (!connection_handler_.IsSessionHeartbeatTracked(connection_key)) { + LOG4CXX_DEBUG(logger_, + "Session heartbeat tracking is not started. " + << "Starting it for session " << session_id); + connection_handler_.StartSessionHeartBeat(connection_key); + } return SendHeartBeatAck(connection_id, session_id, packet.message_id()); } else { LOG4CXX_WARN(logger_, "HeartBeat is not supported"); |