From 7a82beeba3a74f7db8f0b019ee8b7aa1c838e6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Wed, 30 Aug 2023 10:26:45 -0400 Subject: [PATCH] pupnp: lock after dispatch Change-Id: I4c99192c95a82f6a5a386968075cb8991c807c8d --- src/upnp/protocol/natpmp/nat_pmp.cpp | 12 ++++++------ src/upnp/protocol/pupnp/pupnp.cpp | 13 +++++-------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp index 633f580..c5e8ce6 100644 --- a/src/upnp/protocol/natpmp/nat_pmp.cpp +++ b/src/upnp/protocol/natpmp/nat_pmp.cpp @@ -115,26 +115,26 @@ NatPmp::setObserver(UpnpMappingObserver* obs) void NatPmp::terminate(std::condition_variable& cv) { + if (logger_) logger_->debug("NAT-PMP: Terminate instance {}", fmt::ptr(this)); + initialized_ = false; observer_ = nullptr; - { - std::lock_guard<std::mutex> lock(natpmpMutex_); - shutdownComplete_ = true; - cv.notify_one(); - } + std::lock_guard<std::mutex> lock(natpmpMutex_); + shutdownComplete_ = true; + cv.notify_one(); } void NatPmp::terminate() { - std::unique_lock<std::mutex> lk(natpmpMutex_); std::condition_variable cv {}; ioContext->dispatch([&] { terminate(cv); }); + std::unique_lock<std::mutex> lk(natpmpMutex_); if (cv.wait_for(lk, std::chrono::seconds(10), [this] { return shutdownComplete_; })) { if (logger_) logger_->debug("NAT-PMP: Shutdown completed"); } else { diff --git a/src/upnp/protocol/pupnp/pupnp.cpp b/src/upnp/protocol/pupnp/pupnp.cpp index d1feed9..8db0517 100644 --- a/src/upnp/protocol/pupnp/pupnp.cpp +++ b/src/upnp/protocol/pupnp/pupnp.cpp @@ -208,24 +208,21 @@ PUPnP::terminate(std::condition_variable& cv) // Clear all the lists. discoveredIgdList_.clear(); - { - std::lock_guard<std::mutex> lock(pupnpMutex_); - validIgdList_.clear(); - shutdownComplete_ = true; - cv.notify_one(); - } + std::lock_guard<std::mutex> lock(pupnpMutex_); + validIgdList_.clear(); + shutdownComplete_ = true; + cv.notify_one(); } void PUPnP::terminate() { - std::unique_lock<std::mutex> lk(pupnpMutex_); std::condition_variable cv {}; - ioContext->dispatch([&] { terminate(cv); }); + std::unique_lock<std::mutex> lk(pupnpMutex_); if (cv.wait_for(lk, std::chrono::seconds(10), [this] { return shutdownComplete_; })) { if (logger_) logger_->debug("PUPnP: Shutdown completed"); } else { -- GitLab