From fb09e1a7f28e514a72424e1e88e1320269f97b9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Wed, 11 Dec 2019 15:57:57 -0500
Subject: [PATCH] upnp: remove restartTimers_

Change-Id: I41fc348e6bcc2a0e042fe9355cb86288065300d4
---
 src/upnp/protocol/natpmp/nat_pmp.cpp | 14 +++++++-------
 src/upnp/protocol/natpmp/nat_pmp.h   |  1 -
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp
index 20c93280e8..84baace80a 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.cpp
+++ b/src/upnp/protocol/natpmp/nat_pmp.cpp
@@ -67,11 +67,8 @@ NatPmp::NatPmp()
                     or restart_;
             });
             if (not pmpRun_ or not pmpIGD_) break;
-            auto now = clock::now();
-
-            // If the restart flag is set, wait for 1 second to have passed by to try and reinitialize natpmp.
-            if (restart_ and (now - restartTimer_ >= std::chrono::seconds(1))) {
-                std::lock_guard<std::mutex> lk(natpmpMutex_);
+            if (restart_) {
+                std::lock_guard<std::mutex> lkNat(natpmpMutex_);
                 clearNatPmpHdl(natpmpHdl_);
                 int err = 0;
                 char localHostBuf[INET_ADDRSTRLEN];
@@ -87,7 +84,10 @@ NatPmp::NatPmp()
                 }
                 if (err < 0) {
                     JAMI_ERR("NAT-PMP: Can't initialize libnatpmp -> %s", getNatPmpErrorStr(err).c_str());
-                    restartTimer_ = clock::now();
+                    // Retry to re-init nat pmp in 10 seconds
+                    if (pmpRun_)
+                        pmpCv_.wait_for(lk, std::chrono::seconds(10));
+                    continue;
                 } else {
                     char addrbuf[INET_ADDRSTRLEN];
                     inet_ntop(AF_INET, &natpmpHdl_.gateway, addrbuf, sizeof(addrbuf));
@@ -98,6 +98,7 @@ NatPmp::NatPmp()
             }
 
             // Check if we need to update IGD.
+            auto now = clock::now();
             if (pmpIGD_->renewal_ < now) {
                 lk.unlock();
                 searchForPmpIgd();
@@ -172,7 +173,6 @@ NatPmp::clearIgds()
     std::lock_guard<std::mutex> lk(validIgdMutex_);
     pmpIGD_.reset(new PMPIGD());
     restart_ = true;
-    restartTimer_ = clock::now();
 }
 
 void
diff --git a/src/upnp/protocol/natpmp/nat_pmp.h b/src/upnp/protocol/natpmp/nat_pmp.h
index 9370215dd1..030546b486 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.h
+++ b/src/upnp/protocol/natpmp/nat_pmp.h
@@ -95,7 +95,6 @@ private:
     std::thread pmpThread_ {};                          // NatPmp thread.
 
     std::atomic_bool restart_ {false};          // Variable to indicate we need to restart natpmp after a connectivity change.
-    time_point restartTimer_ {clock::now()};    // Keeps track of time elapsed since restart was triggered.
     unsigned int restartSearchRetry_ {0};       // Keeps track of number of times we try to find an IGD after a connectivity change.
 
     std::shared_ptr<PMPIGD> pmpIGD_ {};                 // IGD discovered by NatPmp.
-- 
GitLab