diff options
Diffstat (limited to 'container-messagebus/src/main/java/com/yahoo/container/jdisc/messagebus/NetworkMultiplexerHolder.java')
-rw-r--r-- | container-messagebus/src/main/java/com/yahoo/container/jdisc/messagebus/NetworkMultiplexerHolder.java | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/container-messagebus/src/main/java/com/yahoo/container/jdisc/messagebus/NetworkMultiplexerHolder.java b/container-messagebus/src/main/java/com/yahoo/container/jdisc/messagebus/NetworkMultiplexerHolder.java new file mode 100644 index 00000000000..9020bfaffe3 --- /dev/null +++ b/container-messagebus/src/main/java/com/yahoo/container/jdisc/messagebus/NetworkMultiplexerHolder.java @@ -0,0 +1,45 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.messagebus; + +import com.yahoo.component.AbstractComponent; +import com.yahoo.messagebus.network.Network; +import com.yahoo.messagebus.network.NetworkMultiplexer; +import com.yahoo.messagebus.network.rpc.RPCNetwork; +import com.yahoo.messagebus.network.rpc.RPCNetworkParams; +import com.yahoo.messagebus.shared.NullNetwork; + +/** + * Holds a reference to a singleton {@link NetworkMultiplexer}. + * + * @author jonmv + */ +public class NetworkMultiplexerHolder extends AbstractComponent { + + private final Object monitor = new Object(); + private boolean destroyed = false; + private NetworkMultiplexer net; + + /** Get the singleton RPCNetworkAdapter, creating it if this hasn't yet been done. */ + public NetworkMultiplexer get(RPCNetworkParams params) { + synchronized (monitor) { + if (destroyed) + throw new IllegalStateException("Component already destroyed"); + + return net = net != null ? net : NetworkMultiplexer.shared(newNetwork(params)); + } + } + + private Network newNetwork(RPCNetworkParams params) { + return params.getSlobroksConfig().slobrok().isEmpty() ? new NullNetwork() : new RPCNetwork(params); + } + + @Override + public void deconstruct() { + synchronized (monitor) { + net.destroy(); + net = null; + destroyed = true; + } + } + +} |