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())