diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index 75891639dc538b40d1bf684a53ffeb33af6a04b5..2eed77e57e76a58018b8f4f5103f60a8140acbf6 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 23dbece6f2e79b0d73ea5bc3edf3d789644e5999..f65a087dabd9364f21d1c84f68fd17f608a9386e 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 349b49145b9cb689fc06127d08d19d3eead5fe67..6646d1c809d746af35cabc8de229af00b399458e 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_);