Skip to content
Snippets Groups Projects
Commit e7161574 authored by Guillaume Roguez's avatar Guillaume Roguez Committed by gerrit2
Browse files

sips: fix non-read messages at shutdown

Force received messages to be handled by application
before handling disconnected state event.
This fixed some later call failure event as SIP bye message
is read after the transport shutdown (causing failure).

Change-Id: I269c364927ad301cc6e067b582174e488bebd519
Tuleap: #466
parent 6c926601
No related branches found
No related tags found
No related merge requests found
...@@ -279,6 +279,10 @@ void ...@@ -279,6 +279,10 @@ void
SipsIceTransport::handleEvents() SipsIceTransport::handleEvents()
{ {
// Notify transport manager about state changes first // Notify transport manager about state changes first
// Note: stop when disconnected event is encountered
// and differ its notification AFTER pending rx msg to let
// them a chance to be delivered to application before closing
// the transport.
decltype(stateChangeEvents_) eventDataQueue; decltype(stateChangeEvents_) eventDataQueue;
{ {
std::lock_guard<std::mutex> lk{stateChangeEventsMutex_}; std::lock_guard<std::mutex> lk{stateChangeEventsMutex_};
...@@ -286,11 +290,20 @@ SipsIceTransport::handleEvents() ...@@ -286,11 +290,20 @@ SipsIceTransport::handleEvents()
stateChangeEvents_.clear(); stateChangeEvents_.clear();
} }
if (auto state_cb = pjsip_tpmgr_get_state_cb(trData_.base.tpmgr)) { ChangeStateEventData disconnectedEvent;
bool disconnected = false;
auto state_cb = pjsip_tpmgr_get_state_cb(trData_.base.tpmgr);
if (state_cb) {
for (auto& evdata : eventDataQueue) { for (auto& evdata : eventDataQueue) {
evdata.tls_info.ssl_sock_info = &evdata.ssl_info; evdata.tls_info.ssl_sock_info = &evdata.ssl_info;
evdata.state_info.ext_info = &evdata.tls_info; evdata.state_info.ext_info = &evdata.tls_info;
if (evdata.state != PJSIP_TP_STATE_DISCONNECTED) {
(*state_cb)(&trData_.base, evdata.state, &evdata.state_info); (*state_cb)(&trData_.base, evdata.state, &evdata.state_info);
} else {
disconnectedEvent = std::move(evdata);
disconnected = true;
break;
}
} }
} }
...@@ -328,6 +341,10 @@ SipsIceTransport::handleEvents() ...@@ -328,6 +341,10 @@ SipsIceTransport::handleEvents()
} }
} }
} }
// Time to deliver disconnected event if exists
if (disconnected and state_cb)
(*state_cb)(&trData_.base, disconnectedEvent.state, &disconnectedEvent.state_info);
} }
void void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment