Skip to content
Snippets Groups Projects
Commit a7ad5bbf authored by Adrien Béraud's avatar Adrien Béraud Committed by Guillaume Roguez
Browse files

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
parent 5e57f44a
No related branches found
No related tags found
No related merge requests found
...@@ -165,10 +165,10 @@ SipIceTransport::~SipIceTransport() ...@@ -165,10 +165,10 @@ SipIceTransport::~SipIceTransport()
} }
void void
SipIceTransport::start() SipIceTransport::loop()
{ {
using namespace std::placeholders; while (ice_->getNextPacketSize(comp_id_) > 0)
ice_->setOnRecv(comp_id_, std::bind(&SipIceTransport::onRecv, this, _1, _2)); onRecv();
} }
IpAddr IpAddr
...@@ -215,11 +215,11 @@ SipIceTransport::send(pjsip_tx_data *tdata, const pj_sockaddr_t *rem_addr, ...@@ -215,11 +215,11 @@ SipIceTransport::send(pjsip_tx_data *tdata, const pj_sockaddr_t *rem_addr,
} }
ssize_t 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); rdata.pkt_info.len += ice_->recv(comp_id_,
std::copy_n(buf, max_size, (uint8_t*)rdata.pkt_info.packet + rdata.pkt_info.len); (uint8_t*)rdata.pkt_info.packet+rdata.pkt_info.len,
rdata.pkt_info.len += max_size; sizeof(rdata.pkt_info.packet)-rdata.pkt_info.len);
rdata.pkt_info.zero = 0; rdata.pkt_info.zero = 0;
pj_gettimeofday(&rdata.pkt_info.timestamp); pj_gettimeofday(&rdata.pkt_info.timestamp);
......
...@@ -49,9 +49,9 @@ struct SipIceTransport ...@@ -49,9 +49,9 @@ struct SipIceTransport
~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; IpAddr getLocalAddress() const;
...@@ -76,7 +76,7 @@ struct SipIceTransport ...@@ -76,7 +76,7 @@ struct SipIceTransport
int addr_len, void *token, int addr_len, void *token,
pjsip_transport_callback callback); pjsip_transport_callback callback);
ssize_t onRecv(uint8_t* buf, size_t len); ssize_t onRecv();
pj_status_t shutdown(); pj_status_t shutdown();
......
...@@ -160,11 +160,14 @@ cp_(cp), pool_(pool), endpt_(endpt) ...@@ -160,11 +160,14 @@ cp_(cp), pool_(pool), endpt_(endpt)
#if HAVE_DHT #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_); pjsip_transport_register_type(PJSIP_TRANSPORT_DATAGRAM, "ICE", pjsip_transport_get_default_port_for_type(PJSIP_TRANSPORT_UDP), &ice_pj_transport_type_);
#endif #endif
Manager::instance().registerEventHandler((uintptr_t)this, [this]{ handleEvents(); });
} }
SipTransportBroker::~SipTransportBroker() SipTransportBroker::~SipTransportBroker()
{ {
SFL_DBG("Destroying SipTransportBroker"); SFL_DBG("Destroying SipTransportBroker");
Manager::instance().unregisterEventHandler((uintptr_t)this);
{ {
std::lock_guard<std::mutex> lock(transportMapMutex_); std::lock_guard<std::mutex> lock(transportMapMutex_);
...@@ -239,6 +242,14 @@ SipTransportBroker::transportStateChanged(pjsip_transport* tp, pjsip_transport_s ...@@ -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> std::shared_ptr<SipTransport>
SipTransportBroker::findTransport(pjsip_transport* t) SipTransportBroker::findTransport(pjsip_transport* t)
{ {
...@@ -432,7 +443,6 @@ SipTransportBroker::getIceTransport(const std::shared_ptr<sfl::IceTransport> ice ...@@ -432,7 +443,6 @@ SipTransportBroker::getIceTransport(const std::shared_ptr<sfl::IceTransport> ice
std::unique_lock<std::mutex> lock(transportMapMutex_); std::unique_lock<std::mutex> lock(transportMapMutex_);
transports_[ret->get()] = ret; transports_[ret->get()] = ret;
} }
sip_ice_tr.start();
return ret; return ret;
} }
#endif #endif
......
...@@ -213,6 +213,8 @@ private: ...@@ -213,6 +213,8 @@ private:
void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*); void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*);
void handleEvents();
/** /**
* List of transports so we can bubble the events up. * List of transports so we can bubble the events up.
*/ */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment