diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index d20c978467c3c04d9f971a27fdcb02bd7e6ea661..c94178004c848379a2e0c0fa4a4e699600ebd171 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 d27a95172f4eff631fab2c3fa87bb3d911d334a8..9c75f53283e8c483e6ea74d5557c91ca548224f0 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 67b9296a9540f114f84769adb0ab56044ac6a310..4b5573917eb7f0c6afba5d4ecf22f015216476cd 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();