summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacobkeeler <jacob.keeler@livioradio.com>2020-10-23 11:22:13 -0400
committerjacobkeeler <jacob.keeler@livioradio.com>2020-10-23 11:22:13 -0400
commit1dd78014e4ded7e32ce2b0fd209fecb285cc4a50 (patch)
tree43bfc5505f9aa8e30b286f0d2ce60e1cd5551b84
parentedcc1e52b79d4eb82a5a1921b1c0ebc029f6fdb1 (diff)
downloadsdl_core-fix/unexpected_disconnect_resource_constraint.tar.gz
Use Session property instead of connection ID setfix/unexpected_disconnect_resource_constraint
-rw-r--r--src/components/connection_handler/include/connection_handler/connection.h11
-rw-r--r--src/components/connection_handler/include/connection_handler/connection_handler_impl.h14
-rw-r--r--src/components/connection_handler/src/connection.cc22
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc29
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_;