Rebalance checkConnected() 23/323/4
authorRobert Varga <nite@hq.sk>
Sun, 14 Feb 2016 01:10:18 +0000 (02:10 +0100)
committerGerrit Code Review <gerrit@fd.io>
Fri, 19 Feb 2016 21:02:59 +0000 (21:02 +0000)
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>
vpp-japi/japi/org/openvpp/vppjapi/vppConn.java

index 8de806d..3e8c12a 100644 (file)
@@ -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);
         }
     }