diff options
author | jacobkeeler <jacob.keeler@livioradio.com> | 2020-10-23 11:22:13 -0400 |
---|---|---|
committer | jacobkeeler <jacob.keeler@livioradio.com> | 2020-10-23 11:22:13 -0400 |
commit | 1dd78014e4ded7e32ce2b0fd209fecb285cc4a50 (patch) | |
tree | 43bfc5505f9aa8e30b286f0d2ce60e1cd5551b84 | |
parent | edcc1e52b79d4eb82a5a1921b1c0ebc029f6fdb1 (diff) | |
download | sdl_core-fix/unexpected_disconnect_resource_constraint.tar.gz |
Use Session property instead of connection ID setfix/unexpected_disconnect_resource_constraint
4 files changed, 48 insertions, 28 deletions
diff --git a/src/components/connection_handler/include/connection_handler/connection.h b/src/components/connection_handler/include/connection_handler/connection.h index 1a93509aca..7f983ed638 100644 --- a/src/components/connection_handler/include/connection_handler/connection.h +++ b/src/components/connection_handler/include/connection_handler/connection.h @@ -100,6 +100,7 @@ struct Session { ServiceList service_list; uint8_t protocol_version; utils::SemanticVersion full_protocol_version; + bool final_message_sent_; #ifdef ENABLE_SECURITY security_manager::SSLContext* ssl_context; #endif // ENABLE_SECURITY @@ -107,6 +108,7 @@ struct Session { : service_list() , protocol_version(::protocol_handler::PROTOCOL_VERSION_2) , full_protocol_version(utils::SemanticVersion(2, 0, 0)) + , final_message_sent_(false) #ifdef ENABLE_SECURITY , ssl_context(NULL) #endif // ENABLE_SECURITY @@ -116,6 +118,7 @@ struct Session { : service_list(services) , protocol_version(protocol_version) , full_protocol_version(utils::SemanticVersion(protocol_version, 0, 0)) + , final_message_sent_(false) #ifdef ENABLE_SECURITY , ssl_context(NULL) #endif // ENABLE_SECURITY @@ -124,6 +127,8 @@ struct Session { Service* FindService(const protocol_handler::ServiceType& service_type); const Service* FindService( const protocol_handler::ServiceType& service_type) const; + const bool final_message_sent() const; + void set_final_message_sent(const bool final_message_sent); }; /** @@ -177,6 +182,12 @@ class Connection { uint32_t RemoveSession(uint8_t session_id); /** + * @brief Called upon final message being sent for a session + * @param session session ID + */ + void OnFinalMessageCallback(uint8_t session_id); + + /** * @brief Adds uprotected service to session or * check protection to service has been started before * @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 a97ef5246c..817a79e902 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 @@ -667,15 +667,6 @@ class ConnectionHandlerImpl Connection* GetPrimaryConnection( const ConnectionHandle connection_handle) const; - /** - * @brief Handling a reason for closing a session - * @param connection_id Connection unique identifier. - * @return the reason for connection closed, if connection processed final - * message returns kFinalMessage, otherwise returns kCommon - */ - CloseSessionReason ClosureReasonHandling( - const transport_manager::ConnectionUID connection_id); - const ConnectionHandlerSettings& settings_; /** * \brief Pointer to observer @@ -732,11 +723,6 @@ class ConnectionHandlerImpl */ Connection* ending_connection_; - /** - * @brief List connection, which processed final message - */ - std::set<transport_manager::ConnectionUID> connections_final_message; - #ifdef BUILD_TESTS // Methods for test usage public: diff --git a/src/components/connection_handler/src/connection.cc b/src/components/connection_handler/src/connection.cc index 03915516c3..84904724ad 100644 --- a/src/components/connection_handler/src/connection.cc +++ b/src/components/connection_handler/src/connection.cc @@ -74,6 +74,14 @@ const Service* Session::FindService( return NULL; } +const bool Session::final_message_sent() const { + return final_message_sent_; +} + +void Session::set_final_message_sent(const bool final_message_sent) { + final_message_sent_ = final_message_sent; +} + Connection::Connection(ConnectionHandle connection_handle, DeviceHandle connection_device_handle, ConnectionHandler* connection_handler, @@ -162,6 +170,20 @@ uint32_t Connection::RemoveSession(uint8_t session_id) { return session_id; } +void Connection::OnFinalMessageCallback(uint8_t session_id) { + SDL_LOG_AUTO_TRACE(); + + sync_primitives::AutoLock lock(session_map_lock_); + + SessionMap::iterator it = session_map_.find(session_id); + if (session_map_.end() == it) { + SDL_LOG_WARN("Session not found in this connection!"); + return; + } + + it->second.set_final_message_sent(true); +} + bool Connection::AddNewService(uint8_t session_id, protocol_handler::ServiceType service_type, const bool request_protection, diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index 3ea6928124..67265f8a46 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -682,10 +682,16 @@ void ConnectionHandlerImpl::OnFinalMessageCallback( transport_manager::ConnectionUID connection_handle = 0; uint8_t session_id = 0; PairFromKey(connection_key, &connection_handle, &session_id); - const auto result = connections_final_message.insert(connection_handle); - SDL_LOG_DEBUG("OnFinalMessageCallback found connection " - << connection_handle << " the result of adding is " - << std::boolalpha << result.second); + + sync_primitives::AutoWriteLock connection_list_lock(connection_list_lock_); + ConnectionList::iterator connection_it = + connection_list_.find(connection_handle); + + if (connection_list_.end() != connection_it) { + SDL_LOG_DEBUG("OnFinalMessageCallback found connection " + << connection_handle); + connection_it->second->OnFinalMessageCallback(session_id); + } } uint32_t ConnectionHandlerImpl::OnSessionEndedCallback( @@ -1714,10 +1720,8 @@ void ConnectionHandlerImpl::KeepConnectionAlive(uint32_t connection_key, void ConnectionHandlerImpl::OnConnectionEnded( const transport_manager::ConnectionUID connection_id) { - const auto close_reason = ClosureReasonHandling(connection_id); SDL_LOG_INFO("Delete Connection: " << static_cast<int32_t>(connection_id) - << " from the list." - << " with reason " << close_reason); + << " from the list."); connection_list_lock_.AcquireForWriting(); ConnectionList::iterator itr = connection_list_.find(connection_id); if (connection_list_.end() == itr) { @@ -1742,6 +1746,10 @@ void ConnectionHandlerImpl::OnConnectionEnded( ++session_it) { const uint32_t session_key = KeyFromPair(connection_id, session_it->first); + const CloseSessionReason close_reason = + session_it->second.final_message_sent() + ? CloseSessionReason::kFinalMessage + : CloseSessionReason::kCommon; const ServiceList& service_list = session_it->second.service_list; // Fix: @@ -1846,13 +1854,6 @@ bool ConnectionHandlerImpl::ProtocolVersionUsed( return false; } -CloseSessionReason ConnectionHandlerImpl::ClosureReasonHandling( - const transport_manager::ConnectionUID connection_id) { - const auto is_final = connections_final_message.erase(connection_id); - return is_final ? CloseSessionReason::kFinalMessage - : CloseSessionReason::kCommon; -} - #ifdef BUILD_TESTS ConnectionList& ConnectionHandlerImpl::getConnectionList() { return connection_list_; |