From a7ad5bbff88911cf3ac7f41f9d7a0bb629c425d7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Tue, 6 Jan 2015 14:24:37 -0500
Subject: [PATCH] daemon: receive ICE packets without blocking the ICE mutex

This was causing deadlock.
We now pool ice packets in the main loop.

Refs #63250

Change-Id: I001987955e1a927ed259291d9b0f0af0043ec84e
---
 daemon/src/ringdht/sip_transport_ice.cpp | 14 +++++++-------
 daemon/src/ringdht/sip_transport_ice.h   |  6 +++---
 daemon/src/sip/siptransport.cpp          | 12 +++++++++++-
 daemon/src/sip/siptransport.h            |  2 ++
 4 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/daemon/src/ringdht/sip_transport_ice.cpp b/daemon/src/ringdht/sip_transport_ice.cpp
index daa4ea5b36..593d217bce 100644
--- a/daemon/src/ringdht/sip_transport_ice.cpp
+++ b/daemon/src/ringdht/sip_transport_ice.cpp
@@ -165,10 +165,10 @@ SipIceTransport::~SipIceTransport()
 }
 
 void
-SipIceTransport::start()
+SipIceTransport::loop()
 {
-    using namespace std::placeholders;
-    ice_->setOnRecv(comp_id_, std::bind(&SipIceTransport::onRecv, this, _1, _2));
+    while (ice_->getNextPacketSize(comp_id_) > 0)
+        onRecv();
 }
 
 IpAddr
@@ -215,11 +215,11 @@ SipIceTransport::send(pjsip_tx_data *tdata, const pj_sockaddr_t *rem_addr,
 }
 
 ssize_t
-SipIceTransport::onRecv(uint8_t* buf, size_t len)
+SipIceTransport::onRecv()
 {
-    auto max_size = std::min<size_t>(sizeof(rdata.pkt_info.packet) - rdata.pkt_info.len, len);
-    std::copy_n(buf, max_size, (uint8_t*)rdata.pkt_info.packet + rdata.pkt_info.len);
-    rdata.pkt_info.len += max_size;
+    rdata.pkt_info.len += ice_->recv(comp_id_,
+        (uint8_t*)rdata.pkt_info.packet+rdata.pkt_info.len,
+        sizeof(rdata.pkt_info.packet)-rdata.pkt_info.len);
     rdata.pkt_info.zero = 0;
     pj_gettimeofday(&rdata.pkt_info.timestamp);
 
diff --git a/daemon/src/ringdht/sip_transport_ice.h b/daemon/src/ringdht/sip_transport_ice.h
index 2adccd3a13..8c89186181 100644
--- a/daemon/src/ringdht/sip_transport_ice.h
+++ b/daemon/src/ringdht/sip_transport_ice.h
@@ -49,9 +49,9 @@ struct SipIceTransport
         ~SipIceTransport();
 
         /**
-         * To be called once to start receiving packets
+         * To be called on a regular basis to receive packets
          */
-        void start();
+        void loop();
 
         IpAddr getLocalAddress() const;
 
@@ -76,7 +76,7 @@ struct SipIceTransport
                          int addr_len, void *token,
                          pjsip_transport_callback callback);
 
-        ssize_t onRecv(uint8_t* buf, size_t len);
+        ssize_t onRecv();
 
         pj_status_t shutdown();
 
diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp
index 94ddcd3fe1..40f30404f0 100644
--- a/daemon/src/sip/siptransport.cpp
+++ b/daemon/src/sip/siptransport.cpp
@@ -160,11 +160,14 @@ cp_(cp), pool_(pool), endpt_(endpt)
 #if HAVE_DHT
     pjsip_transport_register_type(PJSIP_TRANSPORT_DATAGRAM, "ICE", pjsip_transport_get_default_port_for_type(PJSIP_TRANSPORT_UDP), &ice_pj_transport_type_);
 #endif
+
+    Manager::instance().registerEventHandler((uintptr_t)this, [this]{ handleEvents(); });
 }
 
 SipTransportBroker::~SipTransportBroker()
 {
     SFL_DBG("Destroying SipTransportBroker");
+    Manager::instance().unregisterEventHandler((uintptr_t)this);
 
     {
         std::lock_guard<std::mutex> lock(transportMapMutex_);
@@ -239,6 +242,14 @@ SipTransportBroker::transportStateChanged(pjsip_transport* tp, pjsip_transport_s
     }
 }
 
+void
+SipTransportBroker::handleEvents()
+{
+    std::unique_lock<std::mutex> lock(iceMutex_);
+    for (auto& t : iceTransports_)
+        t.loop();
+}
+
 std::shared_ptr<SipTransport>
 SipTransportBroker::findTransport(pjsip_transport* t)
 {
@@ -432,7 +443,6 @@ SipTransportBroker::getIceTransport(const std::shared_ptr<sfl::IceTransport> ice
         std::unique_lock<std::mutex> lock(transportMapMutex_);
         transports_[ret->get()] = ret;
     }
-    sip_ice_tr.start();
     return ret;
 }
 #endif
diff --git a/daemon/src/sip/siptransport.h b/daemon/src/sip/siptransport.h
index 4c64d4cbe9..52f929b4bc 100644
--- a/daemon/src/sip/siptransport.h
+++ b/daemon/src/sip/siptransport.h
@@ -213,6 +213,8 @@ private:
 
     void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*);
 
+    void handleEvents();
+
     /**
      * List of transports so we can bubble the events up.
      */
-- 
GitLab