From 51149184dda6552be6d92b3fe66c8d72327a6326 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Mon, 11 Jan 2021 09:57:40 -0500
Subject: [PATCH] sipcall: move ice deletion to avoid deadlock

Change-Id: I1ea5192fd33c3fb4ad9270974aa9ab55cc7c54d0
GitLab: #384
---
 src/sip/sipcall.cpp | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp
index f6f466ff88..602cf9a090 100644
--- a/src/sip/sipcall.cpp
+++ b/src/sip/sipcall.cpp
@@ -1635,7 +1635,6 @@ SIPCall::initIceMediaTransport(bool master,
         JAMI_ERR("No account detected");
         return false;
     }
-    std::lock_guard<std::mutex> lk(transportMtx_);
     JAMI_DBG("[call:%s] create media ICE transport", getCallId().c_str());
     auto iceOptions = options == std::nullopt ? acc->getIceOptions() : *options;
 
@@ -1677,10 +1676,16 @@ SIPCall::initIceMediaTransport(bool master,
     };
 
     auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
-    tmpMediaTransport_ = iceTransportFactory.createUTransport(getCallId().c_str(),
+    auto transport = iceTransportFactory.createUTransport(getCallId().c_str(),
                                                               channel_num,
                                                               master,
                                                               iceOptions);
+    std::lock_guard<std::mutex> lk(transportMtx_);
+    // Destroy old ice on a separate io pool
+    if (tmpMediaTransport_)
+        dht::ThreadPool::io().run([ice = std::make_shared<decltype(tmpMediaTransport_)>(
+                                        std::move(tmpMediaTransport_))] {});
+    tmpMediaTransport_ = std::move(transport);
     return static_cast<bool>(tmpMediaTransport_);
 }
 
-- 
GitLab