upnp_context: check shutdown in dispatch
If we're joining and already shutdown, no need to perform complex
code.
GitLab: #19
Change-Id: Ie8bc24361c9e1ab71b26f19711cce928a2b64077
diff --git a/src/upnp/upnp_context.cpp b/src/upnp/upnp_context.cpp
index a69528b..6a7273e 100644
--- a/src/upnp/upnp_context.cpp
+++ b/src/upnp/upnp_context.cpp
@@ -104,7 +104,7 @@
std::condition_variable cv;
ctx->post([&, this] { shutdown(cv); });
-
+
if (logger_) logger_->debug("Waiting for shutdown ...");
if (cv.wait_for(lk, std::chrono::seconds(30), [this] { return shutdownComplete_; })) {
@@ -114,10 +114,11 @@
}
if (ioContextRunner_) {
- if (logger_) logger_->debug("UPnPContext: stopping io_context thread");
+ if (logger_) logger_->debug("UPnPContext: stopping io_context thread {}", fmt::ptr(this));
ctx->stop();
ioContextRunner_->join();
ioContextRunner_.reset();
+ if (logger_) logger_->debug("UPnPContext: stopping io_context thread - finished {}", fmt::ptr(this));
}
}
@@ -160,11 +161,6 @@
void
UPnPContext::stopUpnp(bool forceRelease)
{
- /*if (not isValidThread()) {
- ctx->post([this, forceRelease] { stopUpnp(forceRelease); });
- return;
- }*/
-
if (logger_) logger_->debug("Stopping UPNP context");
// Clear all current mappings if any.
@@ -392,6 +388,8 @@
UPnPContext::releaseMapping(const Mapping& map)
{
ctx->dispatch([this, map] {
+ if (shutdownComplete_)
+ return;
auto mapPtr = getMappingWithKey(map.getMapKey());
if (not mapPtr) {
@@ -435,6 +433,8 @@
void
UPnPContext::unregisterController(void* controller)
{
+ if (shutdownComplete_)
+ return;
std::unique_lock<std::mutex> lock(mappingMutex_);
if (controllerList_.erase(controller) == 1) {
if (logger_) logger_->debug("Successfully unregistered controller {}", fmt::ptr(controller));
@@ -473,12 +473,6 @@
UPnPContext::requestMapping(const Mapping::sharedPtr_t& map)
{
assert(map);
-
- /*if (not isValidThread()) {
- ctx->post([this, map] { requestMapping(map); });
- return;
- }*/
-
auto const& igd = getPreferredIgd();
// We must have at least a valid IGD pointer if we get here.
// Not this method is called only if there were a valid IGD, however,
@@ -928,11 +922,6 @@
{
assert(igd);
- /*if (not isValidThread()) {
- ctx->post([this, igd, event] { onIgdUpdated(igd, event); });
- return;
- }*/
-
// Reset to start search for a new best IGD.
preferredIgd_.reset();
@@ -1079,11 +1068,6 @@
void
UPnPContext::deleteAllMappings(PortType type)
{
- /*if (not isValidThread()) {
- ctx->post([this, type] { deleteAllMappings(type); });
- return;
- }*/
-
std::lock_guard<std::mutex> lock(mappingMutex_);
auto& mappingList = getMappingList(type);
@@ -1098,11 +1082,6 @@
if (not mapRes.isValid())
return;
- /*if (not isValidThread()) {
- ctx->post([this, igd, mapRes] { onMappingRemoved(igd, mapRes); });
- return;
- }*/
-
auto map = getMappingWithKey(mapRes.getMapKey());
// Notify the listener.
if (map and map->getNotifyCallback())
diff --git a/src/upnp/upnp_control.cpp b/src/upnp/upnp_control.cpp
index 4ee6a43..8dacd74 100644
--- a/src/upnp/upnp_control.cpp
+++ b/src/upnp/upnp_control.cpp
@@ -26,13 +26,10 @@
upnpContext_->dispatch([c=upnpContext_, this]{
c->registerController(this);
});
- //if (upnpContext_->logger_) upnpContext_->logger_->debug("Controller@{}: Created UPnP Controller session", fmt::ptr(this));
}
Controller::~Controller()
{
- //if (logger_) logger_->debug("Controller@{}: Destroying UPnP Controller session", fmt::ptr(this));
-
releaseAllMappings();
upnpContext_->dispatch([c=upnpContext_, this]{
c->unregisterController(this);
@@ -112,9 +109,6 @@
if (map.getMapKey()) {
std::lock_guard<std::mutex> lock(mapListMutex_);
auto ret = mappingList_.emplace(map.getMapKey(), map);
- if (not ret.second) {
- // JAMI_WARN("Mapping request for %s already in the list!", map.toString().c_str());
- }
}
}
@@ -124,12 +118,7 @@
assert(upnpContext_);
std::lock_guard<std::mutex> lk(mapListMutex_);
- if (mappingList_.erase(map.getMapKey()) != 1) {
- // JAMI_ERR("Failed to remove mapping %s from local list", map.getTypeStr());
- return false;
- }
-
- return true;
+ return mappingList_.erase(map.getMapKey()) == 1;
}
uint16_t