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