diff --git a/core/src/main/java/com/google/net/stubby/ChannelImpl.java b/core/src/main/java/com/google/net/stubby/ChannelImpl.java index 9fbba41fe9..b8e3bd7685 100644 --- a/core/src/main/java/com/google/net/stubby/ChannelImpl.java +++ b/core/src/main/java/com/google/net/stubby/ChannelImpl.java @@ -52,12 +52,14 @@ public final class ChannelImpl extends AbstractService implements Channel { @Override protected synchronized void doStop() { - if (activeTransport != null) { - activeTransport.stopAsync(); - activeTransport = null; - // The last TransportListener will call notifyStopped(). - } else { + if (transports.isEmpty()) { notifyStopped(); + } else { + // The last TransportListener will call notifyStopped(). + if (activeTransport != null) { + activeTransport.stopAsync(); + activeTransport = null; + } } } @@ -72,13 +74,14 @@ public final class ChannelImpl extends AbstractService implements Channel { throw new IllegalStateException("Not running"); } ClientTransport newTransport = transportFactory.newClientTransport(); + activeTransport = newTransport; + transports.add(newTransport); + // activeTransport reference can be changed during calls to the transport, even if we hold the + // lock, due to reentrancy. newTransport.addListener( new TransportListener(newTransport), MoreExecutors.directExecutor()); - transports.add(newTransport); - // activeTransport reference can be changed during this call, even if we hold the lock, due to - // reentrancy. newTransport.startAsync(); - activeTransport = newTransport; + return newTransport; } return activeTransport; }