upnp: stop asio context out of the loop

Change-Id: Iaee6527de1a599d6c79ef494637fb968a3035bbb
diff --git a/src/upnp/upnp_context.cpp b/src/upnp/upnp_context.cpp
index 09f441e..8b80293 100644
--- a/src/upnp/upnp_context.cpp
+++ b/src/upnp/upnp_context.cpp
@@ -45,9 +45,9 @@
 
 UPnPContext::UPnPContext(const std::shared_ptr<asio::io_context>& ioContext, const std::shared_ptr<dht::log::Logger>& logger)
  : ctx(createIoContext(ioContext, logger))
+ , logger_(logger)
  , mappingListUpdateTimer_(*ctx)
  , connectivityChangedTimer_(*ctx)
- , logger_(logger)
 {
     if (logger_) logger_->debug("Creating UPnPContext instance [{}]", fmt::ptr(this));
 
@@ -88,22 +88,13 @@
         proto->terminate();
     }
 
-    {
-        std::lock_guard<std::mutex> lock(mappingMutex_);
-        mappingList_->clear();
-        mappingListUpdateTimer_.cancel();
-        controllerList_.clear();
-        protocolList_.clear();
-        shutdownComplete_ = true;
-        cv.notify_one();
-    }
-
-    if (ioContextRunner_) {
-        if (logger_) logger_->debug("UPnPContext: stopping io_context thread");
-        ctx->stop();
-        ioContextRunner_->join();
-        ioContextRunner_.reset();
-    }
+    std::lock_guard<std::mutex> lock(mappingMutex_);
+    mappingList_->clear();
+    mappingListUpdateTimer_.cancel();
+    controllerList_.clear();
+    protocolList_.clear();
+    shutdownComplete_ = true;
+    cv.notify_one();
 }
 
 void
@@ -121,6 +112,13 @@
     } else {
         if (logger_) logger_->error("Shutdown timed-out");
     }
+
+    if (ioContextRunner_) {
+        if (logger_) logger_->debug("UPnPContext: stopping io_context thread");
+        ctx->stop();
+        ioContextRunner_->join();
+        ioContextRunner_.reset();
+    }
 }
 
 UPnPContext::~UPnPContext()