From 416b0e4540b4f51cdf2d2f5bfab100cb81ddc750 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sat, 17 Jan 2009 17:28:37 +0000
Subject: [PATCH] Prevent two NTCP Pumpers

---
 .../net/i2p/router/transport/CommSystemFacadeImpl.java    | 7 ++++---
 .../src/net/i2p/router/transport/ntcp/EventPumper.java    | 7 +++++++
 .../src/net/i2p/router/transport/ntcp/NTCPTransport.java  | 8 ++++++++
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index d20c978467..c94178004c 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -285,9 +285,10 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         _log.warn("Halting NTCP to change address");
         t.stopListening();
         newAddr.setOptions(newProps);
-        // Give NTCP Pumper time to stop so we don't end up with two...
-        // Need better way
-        try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
+        // Wait for NTCP Pumper to stop so we don't end up with two...
+        while (t.isAlive()) {
+            try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
+        }
         t.restartListening(newAddr);
         _log.warn("Changed NTCP Address and started up, address is now " + newAddr);
         return;     	
diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
index d27a95172f..9c75f53283 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
@@ -85,6 +85,13 @@ public class EventPumper implements Runnable {
             _selector.wakeup();
     }
     
+    /**
+     *  Selector can take quite a while to close after calling stopPumping()
+     */
+    public boolean isAlive() {
+        return _alive || (_selector != null && _selector.isOpen());
+    }
+
     public void register(ServerSocketChannel chan) {
         if (_log.shouldLog(Log.DEBUG)) _log.debug("Registering server socket channel");
         synchronized (_wantsRegister) { _wantsRegister.add(chan); }
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
index 67b9296a95..4b5573917e 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
@@ -432,6 +432,10 @@ public class NTCPTransport extends TransportImpl {
         return bindAddress();
     }
 
+    public boolean isAlive() {
+        return _pumper.isAlive();
+    }
+
     private RouterAddress bindAddress() {
         if (_myAddress != null) {
             try {
@@ -538,6 +542,10 @@ public class NTCPTransport extends TransportImpl {
         }
     }
     
+    /**
+     *  This doesn't (completely) block, caller should check isAlive()
+     *  before calling startListening() or restartListening()
+     */
     public void stopListening() {
         if (_log.shouldLog(Log.DEBUG)) _log.debug("Stopping ntcp transport");
         _pumper.stopPumping();
-- 
GitLab