summaryrefslogtreecommitdiff
path: root/src/components/connection_handler/src/connection_handler_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/connection_handler/src/connection_handler_impl.cc')
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index 045985f650..478127c42a 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -354,8 +354,8 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
// so they can send appropriate Ack or NAK messages on the correct transport.
transport_manager::ConnectionUID primary_connection_handle =
connection_handle;
+ SessionTransports st = GetSessionTransports(session_id);
if (session_id != 0) {
- SessionTransports st = GetSessionTransports(session_id);
if (st.primary_transport == 0) {
LOG4CXX_WARN(logger_,
"OnSessionStartedCallback could not find Session in the "
@@ -424,6 +424,11 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
}
context.new_session_id_ = session_id;
context.hash_id_ = protocol_handler::HASH_ID_NOT_SUPPORTED;
+
+ if (st.secondary_transport == connection_handle) {
+ sync_primitives::AutoLock auto_lock(session_connection_map_lock_ptr_);
+ st.secondary_transport_services.push_back(service_type);
+ }
}
sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
@@ -1444,11 +1449,16 @@ void ConnectionHandlerImpl::SendEndService(uint32_t key, uint8_t service_type) {
<< static_cast<int>(st.primary_transport)
<< " and secondary connection "
<< static_cast<int>(st.secondary_transport));
-
- protocol_handler_->SendEndService(st.primary_transport,
- st.secondary_transport,
- session_id,
- service_type);
+ sync_primitives::AutoLock auto_lock(session_connection_map_lock_ptr_);
+ auto it = std::find(st.secondary_transport_services.begin(),
+ st.secondary_transport_services.end(),
+ service_type);
+ if (it != st.secondary_transport_services.end()) {
+ connection_handle = st.secondary_transport;
+ st.secondary_transport_services.erase(it);
+ }
+ protocol_handler_->SendEndService(
+ st.primary_transport, connection_handle, session_id, service_type);
}
}
}