jvpp: make shm_prefix configurable (VPP-591)
[vpp.git] / src / vpp-api / java / jvpp-registry / io / fd / vpp / jvpp / VppJNIConnection.java
index 320c128..53eaa79 100644 (file)
 package io.fd.vpp.jvpp;
 
 import static io.fd.vpp.jvpp.NativeLibraryLoader.loadLibrary;
+import static java.lang.String.format;
 
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -30,13 +33,14 @@ import java.util.logging.Logger;
  */
 public final class VppJNIConnection implements VppConnection {
     private static final Logger LOG = Logger.getLogger(VppJNIConnection.class.getName());
+    private static final String DEFAULT_SHM_PREFIX = "/vpe-api";
 
     static {
         final String libName = "libjvpp_registry.so";
         try {
             loadLibrary(libName, VppJNIConnection.class);
         } catch (IOException e) {
-            LOG.log(Level.SEVERE, String.format("Can't find vpp jni library: %s", libName), e);
+            LOG.log(Level.SEVERE, format("Can't find vpp jni library: %s", libName), e);
             throw new ExceptionInInitializerError(e);
         }
     }
@@ -44,6 +48,7 @@ public final class VppJNIConnection implements VppConnection {
     private ConnectionInfo connectionInfo;
 
     private final String clientName;
+    private final String shmPrefix;
     private volatile boolean disconnected = false;
 
     /**
@@ -54,6 +59,12 @@ public final class VppJNIConnection implements VppConnection {
      */
     public VppJNIConnection(final String clientName) {
         this.clientName = Objects.requireNonNull(clientName, "Null clientName");
+        this.shmPrefix = DEFAULT_SHM_PREFIX;
+    }
+
+    public VppJNIConnection(final String clientName, final String shmPrefix) {
+        this.clientName = Objects.requireNonNull(clientName, "Null clientName");
+        this.shmPrefix = Objects.requireNonNull(shmPrefix, "Null shmPrefix");
     }
 
     /**
@@ -73,16 +84,18 @@ public final class VppJNIConnection implements VppConnection {
 
     @Override
     public void connect() throws IOException {
-        _connect();
+        _connect(shmPrefix);
     }
 
-    private void _connect() throws IOException {
+    private void _connect(final String shmPrefix) throws IOException {
+        Objects.requireNonNull(shmPrefix, "Shared memory prefix must be defined");
+
         synchronized (VppJNIConnection.class) {
             if (connections.containsKey(clientName)) {
                 throw new IOException("Client " + clientName + " already connected");
             }
 
-            connectionInfo = clientConnect(clientName);
+            connectionInfo = clientConnect(shmPrefix, clientName);
             if (connectionInfo.status != 0) {
                 throw new IOException("Connection returned error " + connectionInfo.status);
             }
@@ -130,7 +143,7 @@ public final class VppJNIConnection implements VppConnection {
         }
     }
 
-    private static native ConnectionInfo clientConnect(String clientName);
+    private static native ConnectionInfo clientConnect(String shmPrefix, String clientName);
 
     private static native void clientDisconnect();