diff options
author | Robert Varga <nite@hq.sk> | 2016-02-14 02:10:18 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@fd.io> | 2016-02-19 21:02:59 +0000 |
commit | e1cfcbcda62a94caffc3cf2a40f3440d3752f9d9 (patch) | |
tree | d70e953694948b12afd0e22a302407b64d7fb5a2 /vpp-japi/japi/org/openvpp/vppjapi/vppConn.java | |
parent | 9b7057fe36d00adc136b4f41c699041c1591635d (diff) |
Rebalance checkConnected()
AtomicBoolean forces the enclosed boolean to be cache-aligned,
needlessly hitting a cacheline. Since we only flip state only once,
when the connection is severed, we can turn this into a volatile
boolean.
Doing that is costing us a synchronized close(), but that is perfectly
acceptable, as that is called only once.
Change-Id: I76fda3d3f65a5f800e7d3970b0b8fe99fb3e8b6d
Signed-off-by: Robert Varga <nite@hq.sk>
Diffstat (limited to 'vpp-japi/japi/org/openvpp/vppjapi/vppConn.java')
-rw-r--r-- | vpp-japi/japi/org/openvpp/vppjapi/vppConn.java | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/vpp-japi/japi/org/openvpp/vppjapi/vppConn.java b/vpp-japi/japi/org/openvpp/vppjapi/vppConn.java index 8de806dc12a..3e8c12a93f9 100644 --- a/vpp-japi/japi/org/openvpp/vppjapi/vppConn.java +++ b/vpp-japi/japi/org/openvpp/vppjapi/vppConn.java @@ -23,7 +23,6 @@ import java.nio.file.StandardCopyOption; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; import org.openvpp.vppjapi.vppVersion; import org.openvpp.vppjapi.vppInterfaceDetails; @@ -39,8 +38,8 @@ public class vppConn implements AutoCloseable { static { try { loadLibrary(); - } catch (IOException | RuntimeException e) { - System.out.printf ("Can't find vpp jni library: %s\n", LIBNAME); + } catch (Exception e) { + System.out.printf("Can't find vpp jni library: %s\n", LIBNAME); throw new ExceptionInInitializerError(e); } } @@ -67,7 +66,7 @@ public class vppConn implements AutoCloseable { private static void loadLibrary() throws IOException { try (final InputStream is = vppConn.class.getResourceAsStream('/' + LIBNAME)) { if (is == null) { - throw new IOException(String.format("Failed to open library resource %s", + throw new IOException(String.format("Failed to open library resource %s", LIBNAME)); } loadStream(is); @@ -75,8 +74,8 @@ public class vppConn implements AutoCloseable { } private static vppConn currentConnection = null; - private final AtomicBoolean disconnected = new AtomicBoolean(false); private final String clientName; + private volatile boolean disconnected = false; // Hidden on purpose to prevent external instantiation vppConn(final String clientName) throws IOException { @@ -97,8 +96,10 @@ public class vppConn implements AutoCloseable { } @Override - public final void close() { - if (disconnected.compareAndSet(false, true)) { + public synchronized final void close() { + if (!disconnected) { + disconnected = true; + synchronized (vppConn.class) { clientDisconnect(); currentConnection = null; @@ -112,7 +113,7 @@ public class vppConn implements AutoCloseable { * @throws IllegalStateException if this instance was disconnected. */ protected final void checkConnected() { - if (disconnected.get()) { + if (disconnected) { throw new IllegalStateException("Disconnected client " + clientName); } } |