From 47a54cbb6a3201308f58139d852945b7dc2100ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Fri, 16 Jan 2015 16:56:42 -0500 Subject: [PATCH] siptransport: early shutdown for transport give transports more time to be destroyed by pjsip Refs #63196 Change-Id: I065e9e86fc2b3d5bc42f6e7797b1168e7cf00cd4 --- daemon/src/sip/siptransport.cpp | 11 +++++++++++ daemon/src/sip/siptransport.h | 5 +++++ daemon/src/sip/sipvoiplink.cpp | 11 ++++++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index 75891639dc..2eed77e57e 100644 --- a/daemon/src/sip/siptransport.cpp +++ b/daemon/src/sip/siptransport.cpp @@ -269,6 +269,17 @@ SipTransportBroker::findTransport(pjsip_transport* t) } } +void +SipTransportBroker::shutdown() +{ + std::unique_lock<std::mutex> lock(transportMapMutex_); + for (auto& t : transports_) { + if (auto transport = t.second.lock()) { + pjsip_transport_shutdown(transport->get()); + } + } +} + void SipTransportBroker::waitForReleased(const SipTransportDescr& tp, std::function<void(bool)> released_cb) { diff --git a/daemon/src/sip/siptransport.h b/daemon/src/sip/siptransport.h index 23dbece6f2..f65a087dab 100644 --- a/daemon/src/sip/siptransport.h +++ b/daemon/src/sip/siptransport.h @@ -198,6 +198,11 @@ public: */ void waitForReleased(const SipTransportDescr& tp, std::function<void(bool)> released_cb); + /** + * Start gracefull shutdown procedure for all transports + */ + void shutdown(); + private: NON_COPYABLE(SipTransportBroker); diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index 349b49145b..6646d1c809 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -627,11 +627,11 @@ SIPVoIPLink::~SIPVoIPLink() const int MAX_TIMEOUT_ON_LEAVING = 5; + sipTransport->shutdown(); + for (int timeout = 0; pjsip_tsx_layer_get_tsx_count() and timeout < MAX_TIMEOUT_ON_LEAVING; timeout++) sleep(1); - Manager::instance().unregisterEventHandler((uintptr_t)this); - const pj_time_val tv = {0, 10}; pjsip_endpt_handle_events(endpt_, &tv); @@ -639,11 +639,12 @@ SIPVoIPLink::~SIPVoIPLink() RING_ERR("%d SIP calls remains!", Manager::instance().callFactory.callCount<SIPCall>()); - pjsip_endpt_destroy(endpt_); - - // destroy SIP transport after endpoint + // destroy SIP transport before endpoint sipTransport.reset(); + Manager::instance().unregisterEventHandler((uintptr_t)this); + + pjsip_endpt_destroy(endpt_); pj_pool_release(pool_); pj_caching_pool_destroy(cp_); -- GitLab