Fix possible NPE when starting a transport fails before startAsync() returns.
transportFailedOrStopped() sets activeTransport to null, but
obtainActiveTransport expected it to be non-null because it just set it.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=74264310
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 158e99e..9fbba41 100644
--- a/core/src/main/java/com/google/net/stubby/ChannelImpl.java
+++ b/core/src/main/java/com/google/net/stubby/ChannelImpl.java
@@ -71,11 +71,14 @@
if (state() != State.RUNNING) {
throw new IllegalStateException("Not running");
}
- activeTransport = transportFactory.newClientTransport();
- activeTransport.addListener(
- new TransportListener(activeTransport), MoreExecutors.directExecutor());
- transports.add(activeTransport);
- activeTransport.startAsync();
+ ClientTransport newTransport = transportFactory.newClientTransport();
+ 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 activeTransport;
}