You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2011/05/06 19:28:49 UTC

svn commit: r1100295 - in /commons/sandbox/runtime/trunk/src/main: java/org/apache/commons/runtime/net/ native/shared/

Author: mturk
Date: Fri May  6 17:28:49 2011
New Revision: 1100295

URL: http://svn.apache.org/viewvc?rev=1100295&view=rev
Log:
Use java byte array for acr_sockaddr_t storage since we cannot be sure that finalize will be called

Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/EndpointAddress.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpointAddress.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java
    commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/EndpointAddress.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/EndpointAddress.java?rev=1100295&r1=1100294&r2=1100295&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/EndpointAddress.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/EndpointAddress.java Fri May  6 17:28:49 2011
@@ -28,15 +28,22 @@ public abstract class EndpointAddress
      * This is pointer to Operating System sockaddr structure and is used
      * used internally by socket functions.
      */
-    protected long sa;
+    protected byte[] sa;
 
     private int    family;
-    private static native int     family0(long sa);
-    private static native void    free0(long sa);
-    private static native boolean hasnext0(long sa);
-    private static native boolean equals0(long sa1, long sa2);
-    private static native String  name0(long sa);
+    private static final  int     sasize;
+    private static native int     init0();
+    private static native int     family0(byte[] sa);
+    private static native void    free0(byte[] sa);
+    private static native boolean equals0(byte[] sa1, byte[] sa2);
+    private static native String  name0(byte[] sa);
+
+    static {
+        // Gets the size of internal structure
+        //
+        sasize = init0();
 
+    }
     /**
      * Creates a new EndpointAddress object.
      */
@@ -59,7 +66,7 @@ public abstract class EndpointAddress
      */
     public final AddressFamily getFamily()
     {
-        if (family == -1 && sa != 0L)
+        if (family == -1 && sa != null)
             family = family0(sa);
         return AddressFamily.valueOf(family);
     }
@@ -69,7 +76,7 @@ public abstract class EndpointAddress
      */
     public final boolean hasNext()
     {
-        return hasnext0(sa);
+        return sa.length > sasize;
     }
 
     /**
@@ -105,21 +112,4 @@ public abstract class EndpointAddress
            return false;
     }
 
-    /**
-     * Called by the garbage collector when the object is destroyed.
-     * The class will free internal resources allocated by the Operating system.
-     * @see Object#finalize()
-     * @throws Throwable the {@code Exception} raised by this method.
-     */
-    @Override
-    protected final void finalize()
-        throws Throwable
-    {
-        try {
-            free0(sa);
-        } finally {
-            sa = 0L;
-        }
-    }
-    
 }

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpointAddress.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpointAddress.java?rev=1100295&r1=1100294&r2=1100295&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpointAddress.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpointAddress.java Fri May  6 17:28:49 2011
@@ -34,8 +34,8 @@ import org.apache.commons.runtime.Invali
 public final class LocalEndpointAddress extends EndpointAddress
 {
 
-    private long sa;
-    private native long sockaddr0(String name)
+    private byte[] sa;
+    private native byte[] sockaddr0(String name)
         throws OutOfMemoryError, NetworkException;
     
     private LocalEndpointAddress()

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java?rev=1100295&r1=1100294&r2=1100295&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java Fri May  6 17:28:49 2011
@@ -32,7 +32,7 @@ import org.apache.commons.runtime.Invali
 public abstract class SocketAddress extends EndpointAddress
 {
     // Hide parent field.
-    // private long sa;
+    // private byte[] sa;
     /**
      * First query for IPv4 addresses; only look
      * for IPv6 addresses if the first query failed;
@@ -49,15 +49,15 @@ public abstract class SocketAddress exte
     private static final int IPV6_ADDR_OK  = 2;
 
     /* Structure members */
-    private static native String  hostname0(long sa);
-    private static native String  hostname1(long sa);
-    private static native String  servname0(long sa);
-    private static native int     port0(long sa);
+    private static native String  hostname0(byte[] sa);
+    private static native String  hostname1(byte[] sa);
+    private static native String  servname0(byte[] sa);
+    private static native int     port0(byte[] sa);
 
-    private static native String  ipaddr0(long sa);
-    private static native long    sockaddr0(String hostname, int family, int port, int flags)
+    private static native String  ipaddr0(byte[] sa);
+    private static native byte[]  sockaddr0(String hostname, int family, int port, int flags)
         throws OutOfMemoryError, NetworkException;
-    private static native int     next0(long sa);
+    private static native int     next0(byte[] sa);
 
     private String fqdn = null;
     /**

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c?rev=1100295&r1=1100294&r2=1100295&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c Fri May  6 17:28:49 2011
@@ -719,97 +719,129 @@ AcrGetServInfo(const char **servname, ac
     return 0;
 }
 
-ACR_NET_EXPORT(void, EndpointAddress, free0)(JNI_STDARGS, jlong sa)
+static jbyteArray
+sockaddr_to_byte_array(JNI_STDENV, acr_sockaddr_t *sa)
 {
-    acr_sockaddr_t *np;
-    acr_sockaddr_t *sp = J2P(sa, acr_sockaddr_t *);
-    while (sp != 0) {
-        np = sp->next;
-        AcrFree(sp);
-        sp = np;
+    jbyteArray ba;
+    acr_sockaddr_t *ai;
+    int ai_len = ISIZEOF(acr_sockaddr_t);
+    int ai_cnt = 0;
+    int ai_pos = 0;
+
+    ai = sa;
+    while (ai != 0) {
+        ai_cnt++;
+        ai = ai->next;
     }
+    if (ai_cnt == 0)
+        return 0;
+    ba = (*env)->NewByteArray(env, ai_len * ai_cnt);
+    if (ba == 0)
+        goto cleanup;
+    ai = sa;
+    while (ai != 0) {
+        (*env)->SetByteArrayRegion(env, ba, ai_pos, ai_len, (jbyte *)ai);
+        ai = ai->next;
+        ai_pos += ai_len;
+    }
+cleanup:
+    ai = sa;
+    while (sa != 0) {
+        ai = sa->next;
+        AcrFree(sa);
+        sa = ai;
+    }
+    return ba;
 }
 
-ACR_NET_EXPORT(jint, EndpointAddress, family0)(JNI_STDARGS, jlong sa)
-{
-    acr_sockaddr_t *a = J2P(sa, acr_sockaddr_t *);
+#define JBA2SA(BA) \
+    (acr_sockaddr_t *)(*env)->GetPrimitiveArrayCritical(env, (BA), 0)
+#define JSA_RP(BA, SA) \
+    (*env)->ReleasePrimitiveArrayCritical(env, (BA), (SA), 0)
 
-    if (a == 0)
-        return 0;
-    switch (a->family) {
-        case AF_INET:
-            return 1;
-        case AF_INET6:
-            return 2;
-        case AF_LOCAL:
-            return 3;
-        default:
-        break;
-    }
-    return 0;
+ACR_NET_EXPORT(jint, EndpointAddress, init0)(JNI_STDARGS)
+{
+    return ISIZEOF(acr_sockaddr_t);
 }
 
-ACR_NET_EXPORT(jboolean, EndpointAddress, hasnext0)(JNI_STDARGS, jlong sa)
+ACR_NET_EXPORT(jint, EndpointAddress, family0)(JNI_STDARGS, jbyteArray a)
 {
-    acr_sockaddr_t *a = J2P(sa, acr_sockaddr_t *);
-    if (a != 0 && a->next != 0)
-        return JNI_TRUE;
-    else
-        return JNI_FALSE;
+    jint rv = -1;
+    acr_sockaddr_t *sa = JBA2SA(a);
+
+    if (sa != 0) {
+        switch (sa->family) {
+            case AF_INET:
+                rv = 1;
+            case AF_INET6:
+                rv = 2;
+            case AF_LOCAL:
+                rv = 3;
+            default:
+                rv = 0;
+            break;
+        }
+    }
+    JSA_RP(a, sa);
+    return rv;
 }
 
-ACR_NET_EXPORT(jstring, EndpointAddress, name0)(JNI_STDARGS, jlong sa)
+ACR_NET_EXPORT(jstring, EndpointAddress, name0)(JNI_STDARGS, jbyteArray a)
 {
     char buf[256];
     const char *name = "(null)";
-    acr_sockaddr_t *a = J2P(sa, acr_sockaddr_t *);
+    acr_sockaddr_t *sa = JBA2SA(a);
 
-    if (a != 0) {
-        if (a->hostname[0] == '\0') {
+    if (sa != 0) {
+        if (sa->hostname[0] == '\0') {
             /* Return IP address representation
              */
-            if (AcrGetSockaddrIp(buf, 256, a) == 0)
+            if (AcrGetSockaddrIp(buf, 256, sa) == 0)
                 name = buf;
         }
         else
-            name = a->hostname;
+            name = sa->hostname;
     }
+    JSA_RP(a, sa);
     return AcrNewJavaStringA(env, name);
 }
 
-ACR_NET_EXPORT(jboolean, EndpointAddress, equals0)(JNI_STDARGS, jlong sa1, jlong sa2)
-{
-    acr_sockaddr_t *addr1 = J2P(sa1, acr_sockaddr_t *);
-    acr_sockaddr_t *addr2 = J2P(sa2, acr_sockaddr_t *);
-
-    if (addr1 == 0 || addr2 == 0)
-        return JNI_FALSE;
-    if (addr1->iplen == addr2->iplen &&
-        memcmp(addr1->ipaddr, addr2->ipaddr, addr1->iplen) == 0) {
-        return JNI_TRUE;
+ACR_NET_EXPORT(jboolean, EndpointAddress, equals0)(JNI_STDARGS,
+                                                   jbyteArray sa1,
+                                                   jbyteArray sa2)
+{
+    jboolean rv = JNI_FALSE;
+    acr_sockaddr_t *addr1 = JBA2SA(sa1);
+    acr_sockaddr_t *addr2 = JBA2SA(sa2);
+
+    if (addr1 != 0 && addr2 != 0) {
+        if (addr1->iplen == addr2->iplen &&
+            memcmp(addr1->ipaddr, addr2->ipaddr, addr1->iplen) == 0)
+            rv = JNI_TRUE;
+        else if (V4MAPPED_EQUAL(addr1, addr2))
+            rv = JNI_TRUE;
+        else if (V4MAPPED_EQUAL(addr2, addr1))
+            rv = JNI_TRUE;
     }
-    if (V4MAPPED_EQUAL(addr1, addr2))
-        return 1;
-    if (V4MAPPED_EQUAL(addr2, addr1))
-        return JNI_TRUE;
-    return JNI_FALSE; /* not equal */
+    JSA_RP(sa1, addr1);
+    JSA_RP(sa2, addr2);
+    return rv;
 }
 
-ACR_NET_EXPORT(jlong, LocalEndpointAddress, sockaddr0)(JNI_STDARGS, jstring hostname)
+ACR_NET_EXPORT(jbyteArray, LocalEndpointAddress, sockaddr0)(JNI_STDARGS, jstring hostname)
 {
-    acr_sockaddr_t *sa = 0;
+    jbyteArray     ba;
+    acr_sockaddr_t sa;
     char *np;
     int   rc = 0;
 
+    memset(&sa, 0, sizeof(acr_sockaddr_t));
     WITH_CSTR(hostname) {
 #if HAVE_SYS_UN_H
-        sa = calloc(1, sizeof(acr_sockaddr_t));
-        if (sa == 0)
-            return ACR_ENOMEM;
         if (*J2S(hostname) != '/') {
-            size_t i = (int)strlcpy(sa->hostname, VAR_RUN_PATH "/", sizeof(sa->hostname));
-            strlcat(sa->hostname, J2S(hostname), sizeof(sa->hostname));
-            np = sa->hostname + i;
+            size_t i = (int)strlcpy(sa.hostname, VAR_RUN_PATH "/", sizeof(sa.hostname));
+            strlcat(sa.hostname, J2S(hostname), sizeof(sa.hostname));
+            np = sa.hostname + i;
             while (*np != '\0') {
                 if (*np == '/' || *np == ' ')
                     *np = '_';
@@ -817,114 +849,131 @@ ACR_NET_EXPORT(jlong, LocalEndpointAddre
             }
         }
         else
-            strlcpy(sa->hostname, J2S(hostname), sizeof(sa->hostname));
-        strlcpy(sa->sa.unx.sun_path, sa->hostname, sizeof(sa->sa.unx.sun_path));
-        sa->sa.unx.sun_family = AF_LOCAL;
-        sa->family  = AF_LOCAL;
-        sa->salen   = ISIZEOF(struct sockaddr_un);
-        sa->addrlen = ISIZEOF(sa->sa.unx.sun_path);
-        sa->ipaddr  = &(sa->sa.unx.sun_path);
-        sa->iplen   = sa->addrlen;
+            strlcpy(sa.hostname, J2S(hostname), sizeof(sa.hostname));
+        strlcpy(sa.sa.unx.sun_path, sa.hostname, sizeof(sa.sa.unx.sun_path));
+        sa.sa.unx.sun_family = AF_LOCAL;
+        sa.family  = AF_LOCAL;
+        sa.salen   = ISIZEOF(struct sockaddr_un);
+        sa.addrlen = ISIZEOF(sa.sa.unx.sun_path);
+        sa.ipaddr  = &(sa.sa.unx.sun_path);
+        sa.iplen   = sa.addrlen;
 #elif defined(WINDOWS)
         sa = calloc(1, sizeof(acr_sockaddr_t));
         if (sa == 0)
             return ACR_ENOMEM;
-        strlcpy(sa->hostname, "\\\\.\\pipe\\", sizeof(sa->hostname));
-        strlcat(sa->hostname, J2S(hostname), sizeof(sa->hostname));
-        np = sa->hostname + 9;
+        strlcpy(sa.hostname, "\\\\.\\pipe\\", sizeof(sa.hostname));
+        strlcat(sa.hostname, J2S(hostname), sizeof(sa.hostname));
+        np = sa.hostname + 9;
         while (*np != '\0') {
             if (*np == '/' || *np == '\\'|| *np == ' ')
                 *np = '_';
             np++;
         }
-        sa->family  = AF_LOCAL;
-        sa->addrlen = ISIZEOF(sa->hostname);
-        sa->ipaddr  = &(sa->hostname);
-        sa->iplen   = sa->addrlen;
+        sa.family  = AF_LOCAL;
+        sa.addrlen = ISIZEOF(sa.hostname);
+        sa.ipaddr  = &(sa.hostname);
+        sa.iplen   = sa.addrlen;
 #else
-        sa = 0;
         rc = ACR_ENOTIMPL;
 #endif
     } DONE_WITH_STR(hostname);
 
-    if (rc != 0)
+    if (rc != 0) {
         ACR_THROW_NET_ERROR(rc);
-    return P2J(sa);;
-}
-
-ACR_NET_EXPORT(jstring, SocketAddress, hostname0)(JNI_STDARGS, jlong a)
-{
-    acr_sockaddr_t *sa = J2P(a, acr_sockaddr_t *);
-    if (sa != 0 && sa->hostname != '\0')
-        return AcrNewJavaStringA(env, sa->hostname);
-    else {
-        char buf[256];
-        if (AcrGetSockaddrIp(buf, 256, sa) == 0)
-            return AcrNewJavaStringA(env, buf);
+        return 0;
     }
-    return 0;
+    ba = (*env)->NewByteArray(env, ISIZEOF(acr_sockaddr_t));
+    if (ba != 0)
+        (*env)->SetByteArrayRegion(env, ba, 0, ISIZEOF(acr_sockaddr_t), (jbyte *)&sa);
+    return ba;
+}
+
+ACR_NET_EXPORT(jstring, SocketAddress, hostname0)(JNI_STDARGS, jbyteArray a)
+{
+    jstring rv = 0;
+    acr_sockaddr_t *sa = JBA2SA(a);
+
+    if (sa != 0) {
+        if (sa->hostname != '\0')
+            rv = AcrNewJavaStringA(env, sa->hostname);
+        else {
+            char buf[256];
+            if (AcrGetSockaddrIp(buf, 256, sa) == 0)
+                rv = AcrNewJavaStringA(env, buf);
+        }
+    }
+    JSA_RP(a, sa);
+    return rv;
 }
 
-ACR_NET_EXPORT(jstring, SocketAddress, hostname1)(JNI_STDARGS, jlong a)
+ACR_NET_EXPORT(jstring, SocketAddress, hostname1)(JNI_STDARGS, jbyteArray a)
 {
     const char *host = 0;
     int   rc;
-    acr_sockaddr_t *sa = J2P(a, acr_sockaddr_t *);
+    jstring rv = 0;
+    acr_sockaddr_t *sa = JBA2SA(a);
 
-    if (sa == 0)
-        return 0;
-    rc = AcrGetNameInfo(&host, sa, 0);
-    if (rc == 0)
-        return AcrNewJavaStringA(env, host);
-    else {
-        char buf[256];
-        if (AcrGetSockaddrIp(buf, 256, sa) == 0)
-            return AcrNewJavaStringA(env, buf);
+    if (sa != 0) {
+        rc = AcrGetNameInfo(&host, sa, 0);
+        if (rc == 0)
+            rv = AcrNewJavaStringA(env, host);
+        else {
+            char buf[256];
+            if (AcrGetSockaddrIp(buf, 256, sa) == 0)
+                rv = AcrNewJavaStringA(env, buf);
+        }
     }
-    return 0;
+    JSA_RP(a, sa);
+    return rv;
 }
 
-ACR_NET_EXPORT(jstring, SocketAddress, servname0)(JNI_STDARGS, jlong a)
+ACR_NET_EXPORT(jstring, SocketAddress, servname0)(JNI_STDARGS, jbyteArray a)
 {
     const char *serv = 0;
     int   rc;
-    acr_sockaddr_t *sa = J2P(a, acr_sockaddr_t *);
+    jstring rv = 0;
+    acr_sockaddr_t *sa = JBA2SA(a);
 
-    if (sa != 0 && sa->servname != '\0')
-        return AcrNewJavaStringA(env, sa->servname);
-    else {
-        rc = AcrGetServInfo(&serv, sa, 0);
-        if (rc == 0)
-            return AcrNewJavaStringA(env, serv);
-        else
-            return 0;
+    if (sa != 0) {
+        if (sa->servname != '\0')
+            rv = AcrNewJavaStringA(env, sa->servname);
+        else {
+            rc = AcrGetServInfo(&serv, sa, 0);
+            if (rc == 0)
+                rv = AcrNewJavaStringA(env, serv);
+        }
     }
+    JSA_RP(a, sa);
+    return rv;
 }
 
-ACR_NET_EXPORT(jstring, SocketAddress, ipaddr0)(JNI_STDARGS, jlong a)
+ACR_NET_EXPORT(jstring, SocketAddress, ipaddr0)(JNI_STDARGS, jbyteArray a)
 {
     char buf[256];
-    acr_sockaddr_t *sa = J2P(a, acr_sockaddr_t *);
+    jstring rv = 0;
+    acr_sockaddr_t *sa = JBA2SA(a);
 
-    if (sa == 0)
-        return 0;
-    if (AcrGetSockaddrIp(buf, 256, sa) == 0)
-        return AcrNewJavaStringA(env, buf);
-    else
-        return 0;
+    if (sa != 0) {
+        if (AcrGetSockaddrIp(buf, 256, sa) == 0)
+            rv = AcrNewJavaStringA(env, buf);
+    }
+    JSA_RP(a, sa);
+    return rv;
 }
 
-ACR_NET_EXPORT(jint, SocketAddress, port0)(JNI_STDARGS, jlong a)
+ACR_NET_EXPORT(jint, SocketAddress, port0)(JNI_STDARGS,jbyteArray a)
 {
-    acr_sockaddr_t *sa = J2P(a, acr_sockaddr_t *);
+    jint rv = 0;
+    acr_sockaddr_t *sa = JBA2SA(a);
+
     if (sa != 0)
-        return sa->port;
-    else
-        return 0;
+        rv = sa->port;
+    JSA_RP(a, sa);
+    return rv;
 }
 
-ACR_NET_EXPORT(jlong, SocketAddress, sockaddr0)(JNI_STDARGS, jstring hostname,
-                                                jint family, jint port, jint flags)
+ACR_NET_EXPORT(jbyteArray, SocketAddress, sockaddr0)(JNI_STDARGS, jstring hostname,
+                                                     jint family, jint port, jint flags)
 {
     acr_sockaddr_t *sa = 0;
     int ffamily = AF_UNSPEC;
@@ -956,28 +1005,10 @@ ACR_NET_EXPORT(jlong, SocketAddress, soc
         rc = AcrFindAddresses(&sa, J2S(hostname), ffamily, port, flags);
     } DONE_WITH_STR(hostname);
 
-    if (rc != 0)
+    if (rc != 0) {
         ACR_THROW_NET_ERROR(rc);
-    return P2J(sa);
-}
-
-ACR_NET_EXPORT(jint, SocketAddress, next0)(JNI_STDARGS, jlong a)
-{
-    acr_sockaddr_t *sa = J2P(a, acr_sockaddr_t *);
-
-    if (sa == 0 || sa->next == 0)
-        return -1;
-    switch (sa->next->family) {
-        case AF_INET:
-            return 1;
-        case AF_INET6:
-            return 2;
-        case AF_LOCAL:
-            /* XXX: This can never happen (TM)
-             */
-            return 3;
-        default:
-        break;
+        return 0;
     }
-    return 0;
+    else
+        return sockaddr_to_byte_array(env, sa);
 }