From 240708ff275a314cb8d77e9d21dc2b840cdfcf86 Mon Sep 17 00:00:00 2001
From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Date: Fri, 5 Jun 2015 11:35:16 -0400
Subject: [PATCH] sips: moved cleanup code to be executed by right thread

Code that call pjsip callback must be executed by the main loop thread.
This patch attempts to fix that.

Refs #74724

Change-Id: I3fd89afab6d2d52dda18340e0c383a698d68b852
---
 src/ringdht/sips_transport_ice.cpp | 48 +++++++++++++++---------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/ringdht/sips_transport_ice.cpp b/src/ringdht/sips_transport_ice.cpp
index bb74d07ed7..c9c09ad8e8 100644
--- a/src/ringdht/sips_transport_ice.cpp
+++ b/src/ringdht/sips_transport_ice.cpp
@@ -212,11 +212,35 @@ SipsIceTransport::SipsIceTransport(pjsip_endpoint* endpt,
 SipsIceTransport::~SipsIceTransport()
 {
     RING_DBG("~SipsIceTransport");
+    auto event = state_ == TlsConnectionState::ESTABLISHED;
     shutdown();
     ice_->setOnRecv(comp_id_, nullptr);
     tlsThread_.join();
     Manager::instance().unregisterEventHandler((uintptr_t)this);
 
+    pjsip_transport_add_ref(getTransportBase());
+    auto state_cb = pjsip_tpmgr_get_state_cb(trData_.base.tpmgr);
+    if (state_cb && event) {
+        pjsip_transport_state_info state_info;
+        pjsip_tls_state_info tls_info;
+
+        /* Init transport state info */
+        std::memset(&state_info, 0, sizeof(state_info));
+        std::memset(&tls_info, 0, sizeof(tls_info));
+        pj_ssl_sock_info ssl_info;
+        getInfo(&ssl_info);
+        tls_info.ssl_sock_info = &ssl_info;
+        state_info.ext_info = &tls_info;
+        state_info.status = PJ_SUCCESS;
+
+        (*state_cb)(getTransportBase(), PJSIP_TP_STATE_DISCONNECTED, &state_info);
+    }
+
+    if (not trData_.base.is_shutdown and not trData_.base.is_destroying)
+        pjsip_transport_shutdown(getTransportBase());
+
+    pjsip_transport_dec_ref(getTransportBase());
+
     pj_lock_destroy(trData_.base.lock);
     pj_atomic_destroy(trData_.base.ref_cnt);
 }
@@ -852,31 +876,7 @@ SipsIceTransport::clean()
         buffPool_.clear();
     }
 
-    bool event = state_ == TlsConnectionState::ESTABLISHED;
     closeTlsSession();
-
-    pjsip_transport_add_ref(getTransportBase());
-    auto state_cb = pjsip_tpmgr_get_state_cb(trData_.base.tpmgr);
-    if (state_cb && event) {
-        pjsip_transport_state_info state_info;
-        pjsip_tls_state_info tls_info;
-
-        /* Init transport state info */
-        std::memset(&state_info, 0, sizeof(state_info));
-        std::memset(&tls_info, 0, sizeof(tls_info));
-        pj_ssl_sock_info ssl_info;
-        getInfo(&ssl_info);
-        tls_info.ssl_sock_info = &ssl_info;
-        state_info.ext_info = &tls_info;
-        state_info.status = PJ_SUCCESS;
-
-        (*state_cb)(getTransportBase(), PJSIP_TP_STATE_DISCONNECTED, &state_info);
-    }
-
-    if (not trData_.base.is_shutdown and not trData_.base.is_destroying)
-        pjsip_transport_shutdown(getTransportBase());
-
-    pjsip_transport_dec_ref(getTransportBase());
 }
 
 IpAddr
-- 
GitLab