From 4409c5fcff5632a5e37121c30b06afdb4bca6006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Sat, 22 Feb 2020 15:44:17 -0500 Subject: [PATCH] ice_transport: destroy transport after thread Change-Id: Ia60f621d1847e57634ae387de10d12b7eb2cb965 --- src/ice_transport.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp index 1dd69350ed..8ed9643259 100644 --- a/src/ice_transport.cpp +++ b/src/ice_transport.cpp @@ -402,14 +402,19 @@ IceTransport::Impl::Impl(const char* name, int component_count, bool master, IceTransport::Impl::~Impl() { + JAMI_WARN("[ice:%p] IceTransport::Impl::~Impl() %p", this); sip_utils::register_thread(); - - icest_.reset(); // must be done before ioqueue/timer destruction - threadTerminateFlags_ = true; + iceCV_.notify_all(); + if (thread_.joinable()) thread_.join(); + { + std::lock_guard<std::mutex> lk {iceMutex_}; + icest_.reset(); // must be done before ioqueue/timer destruction + } + if (config_.stun_cfg.ioqueue) pj_ioqueue_destroy(config_.stun_cfg.ioqueue); @@ -1337,11 +1342,11 @@ IceTransport::waitForInitialization(std::chrono::milliseconds timeout) { std::unique_lock<std::mutex> lk(pimpl_->iceMutex_); if (!pimpl_->iceCV_.wait_for(lk, timeout, - [this]{ return pimpl_->_isInitialized() or pimpl_->_isFailed(); })) { + [this]{ return pimpl_->threadTerminateFlags_ or pimpl_->_isInitialized() or pimpl_->_isFailed(); })) { JAMI_WARN("[ice:%p] waitForInitialization: timeout", this); return -1; } - return not pimpl_->_isFailed(); + return not (pimpl_->threadTerminateFlags_ or pimpl_->_isFailed()); } int @@ -1349,11 +1354,11 @@ IceTransport::waitForNegotiation(std::chrono::milliseconds timeout) { std::unique_lock<std::mutex> lk(pimpl_->iceMutex_); if (!pimpl_->iceCV_.wait_for(lk, timeout, - [this]{ return pimpl_->_isRunning() or pimpl_->_isFailed(); })) { + [this]{ return pimpl_->threadTerminateFlags_ or pimpl_->_isRunning() or pimpl_->_isFailed(); })) { JAMI_WARN("[ice:%p] waitForIceNegotiation: timeout", this); return -1; } - return not pimpl_->_isFailed(); + return not (pimpl_->threadTerminateFlags_ or pimpl_->_isFailed()); } ssize_t -- GitLab