diff --git a/src/upnp/protocol/pupnp/pupnp.cpp b/src/upnp/protocol/pupnp/pupnp.cpp index 8db05170fb16201a73dbcc851d61c9026becf5cb..d07cc20768b431190385e2e56f0d9792a9950c31 100644 --- a/src/upnp/protocol/pupnp/pupnp.cpp +++ b/src/upnp/protocol/pupnp/pupnp.cpp @@ -194,6 +194,9 @@ PUPnP::terminate(std::condition_variable& cv) clientRegistered_ = false; observer_ = nullptr; + std::unique_lock<std::mutex> lk(ongoingOpsMtx_); + destroying_ = true; + cvOngoing_.wait(lk, [&]() { return ongoingOps_ == 0; }); UpnpUnRegisterClient(ctrlptHandle_); @@ -779,6 +782,12 @@ void PUPnP::downLoadIgdDescription(const std::string& locationUrl) { if(logger_) logger_->debug("PUPnP: downLoadIgdDescription {}", locationUrl); + { + std::lock_guard<std::mutex> lk(ongoingOpsMtx_); + if (destroying_) + return; + ongoingOps_++; + } IXML_Document* doc_container_ptr = nullptr; int upnp_err = UpnpDownloadXmlDoc(locationUrl.c_str(), &doc_container_ptr); @@ -794,6 +803,9 @@ PUPnP::downLoadIgdDescription(const std::string& locationUrl) } }); } + std::lock_guard<std::mutex> lk(ongoingOpsMtx_); + ongoingOps_--; + cvOngoing_.notify_one(); } void diff --git a/src/upnp/protocol/pupnp/pupnp.h b/src/upnp/protocol/pupnp/pupnp.h index 4c0ea789d53c54ea29ed1fd8163e8d178d3667dc..7deb4fba43788627cc474271f96944ef3229eea7 100644 --- a/src/upnp/protocol/pupnp/pupnp.h +++ b/src/upnp/protocol/pupnp/pupnp.h @@ -243,6 +243,12 @@ private: // Shutdown synchronization bool shutdownComplete_ {false}; + + // Count ongoing operations + std::mutex ongoingOpsMtx_; + std::condition_variable cvOngoing_; + int ongoingOps_ {0}; + bool destroying_ {false}; }; } // namespace upnp