package org.apache.thrift.transport;
+import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
* This is the implementation of the awful hack described above.
* <code>WeakHashMap</code> is used to ensure that we don't leak memory.
*/
- private static Map<TTransport, TSaslServerTransport> transportMap =
- Collections.synchronizedMap(new WeakHashMap<TTransport, TSaslServerTransport>());
+ private static Map<TTransport, WeakReference<TSaslServerTransport>> transportMap =
+ Collections.synchronizedMap(new WeakHashMap<TTransport, WeakReference<TSaslServerTransport>>());
/**
* Mapping from SASL mechanism name -> all the parameters required to
*/
@Override
public TTransport getTransport(TTransport base) {
- TSaslServerTransport ret = transportMap.get(base);
- if (ret == null) {
+ WeakReference<TSaslServerTransport> ret = transportMap.get(base);
+ if (ret == null || ret.get() == null) {
LOGGER.debug("transport map does not contain key", base);
- ret = new TSaslServerTransport(serverDefinitionMap, base);
+ ret = new WeakReference<TSaslServerTransport>(new TSaslServerTransport(serverDefinitionMap, base));
try {
- ret.open();
+ ret.get().open();
} catch (TTransportException e) {
LOGGER.debug("failed to open server transport", e);
throw new RuntimeException(e);
}
- transportMap.put(base, ret);
+ transportMap.put(base, ret); // No need for putIfAbsent().
+ // Concurrent calls to getTransport() will pass in different TTransports.
} else {
LOGGER.debug("transport map does contain key {}", base);
}
- return ret;
+ return ret.get();
}
}
}