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 2009/05/25 13:29:34 UTC

svn commit: r778391 - in /commons/sandbox/runtime/trunk/src: main/java/org/apache/commons/runtime/ main/native/include/ main/native/os/unix/ main/native/os/win32/ main/native/shared/ main/native/test/ test/org/apache/commons/runtime/

Author: mturk
Date: Mon May 25 11:29:34 2009
New Revision: 778391

URL: http://svn.apache.org/viewvc?rev=778391&view=rev
Log:
Add DescriptorType object and Descriptor flags final field

Added:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DescriptorType.java   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java
    commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c
    commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/group.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/user.c
    commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
    commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java Mon May 25 11:29:34 2009
@@ -39,7 +39,12 @@
      * If the operation is recoverable the clearerr() should be
      * used after the recovery.
      */
-    private int     IERRNUM;
+    private int       IERRNUM;
+
+    /* Immutable Descriptor flags.
+     * Set by the native on Descriptor creation.
+     */
+    private final int IDFLAGS;
 
     /*
      * Descriptor can be only created from native code.
@@ -48,11 +53,13 @@
     private  Descriptor()
     {
         // No Instance
+        IDFLAGS = 0;
     }
 
-    protected  Descriptor(int e)
+    protected  Descriptor(int v)
     {
-        IERRNUM = e;
+        IERRNUM = 0;
+        IDFLAGS = v;
     }
 
     private native void close0()
@@ -143,6 +150,16 @@
     }
 
     /**
+     * Get the descriptory type.
+     * This method is public, but it is intended for the internal use only.
+     */
+    public final DescriptorType getType()
+    {
+        // Lower IDFLAGS byte is Descriptor type
+        return DescriptorType.valueOf(IDFLAGS & 0x000000FF);
+    }
+
+    /**
      * Check if the underlying Operating system descriptor is closed.
      * @return {@code true} if descriptor is closed {@code false} otherwise.
      */

Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DescriptorType.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DescriptorType.java?rev=778391&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DescriptorType.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DescriptorType.java Mon May 25 11:29:34 2009
@@ -0,0 +1,87 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.runtime;
+
+/**
+ * Determines the underlying OS descriptor type.
+ */
+public enum DescriptorType
+{
+    /** Unknown {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 0}
+     */
+    UNKNOWN(        0),
+    /** File {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 1}
+     */
+    FILE(           1),
+    /** User {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 2}
+     */
+    USER(           2),
+    /** Group {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 3}
+     */
+    GROUP(          3),
+    /** Global Mutex {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 4}
+     */
+    MUTEX(          4),
+    /** Shared memory {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 4}
+     */
+    SHM(            5),
+    /** Pipe {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 4}
+     */
+    PIPE(           6),
+    /** Socket {@code Descriptor} type.
+     * <br/>Defined integer value is: {@code 4}
+     */
+    SOCKET(         7);
+
+
+    private int value;
+    private DescriptorType(int v)
+    {
+        value = v;
+    }
+
+    /** Integer representing the value of this Enum.
+     */
+    public int valueOf()
+    {
+        return value;
+    }
+
+    /** Return the {@code DescriptorType} matching the specified {@code value}.
+     * @param value Integer value matching one of the
+     *              {@code DescriptorType} enums.
+     * @throws IllegalArgumentException if {@code value} does not match
+     *  to and of the {@code DescriptorType} enums.
+     */
+    public static DescriptorType valueOf(int value)
+        throws IllegalArgumentException
+    {
+        for (DescriptorType e : values()) {
+            if (e.value == value)
+                return e;
+        }
+        throw new IllegalArgumentException("Invalid initializer: " + value);
+    }
+
+}

Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DescriptorType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h Mon May 25 11:29:34 2009
@@ -31,6 +31,16 @@
  *
  */
 
+#define ACR_DT_UNKNOWN          0x00000000
+#define ACR_DT_FILE             0x00000001
+#define ACR_DT_USER             0x00000002
+#define ACR_DT_GROUP            0x00000003
+#define ACR_DT_MUTEX            0x00000004
+#define ACR_DT_SHM              0x00000005
+#define ACR_DT_PIPE             0x00000006
+#define ACR_DT_SOCKET           0x00000007
+#define ACR_DT_MASK             0x000000FF
+
 typedef enum {
     ACR_DESC_CLOSE,
     ACR_DESC_SYNC
@@ -55,13 +65,13 @@
 /**
  * Create new Descriptor class instance
  * @param env Current JNI environment
- * @param e Initial errno code for the descriptor object.
+ * @param f Descriptor flags.
  * @param i Native integer descriptor to wrap into Descriptor class
  * @param p Native pointer descriptor to wrap into Descriptor class
  * @param cb handler function to use
  * @param ho handler function to use
  */
-ACR_DECLARE(jobject) ACR_DescriptorCreate(JNIEnv *env, int e, int i, void *p,
+ACR_DECLARE(jobject) ACR_DescriptorCreate(JNIEnv *env, int f, int i, void *p,
                                           acr_descriptor_handler_fn_t *cb);
 
 /**
@@ -84,11 +94,19 @@
  * Get the native errno number from the Descriptor object.
  * @param env Current JNI environment
  * @param obj Java Descriptor object use.
- * @return Underlying errno.
+ * @return Underlying descriptor IERRNUM field value.
  */
 ACR_DECLARE(int) ACR_DescriptorGetErr(JNIEnv *env, jobject obj);
 
 /**
+ * Get the Descriptor flags.
+ * @param env Current JNI environment
+ * @param obj Java Descriptor object use.
+ * @return Underlying descriptor IDFLAGS field value.
+ */
+ACR_DECLARE(int) ACR_DescriptorFlags(ACR_JNISTDARGS);
+
+/**
  * Get the native int descriptor from the Descriptor object.
  * @param env Current JNI environment
  * @param obj Java Descriptor object use.

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c Mon May 25 11:29:34 2009
@@ -115,7 +115,7 @@
     if (!gr)
         return NULL;
 
-    gid = ACR_DescriptorCreate(_E, 0, gr->gr_gid, NULL, NULL);
+    gid = ACR_DescriptorCreate(_E, ACR_DT_GROUP, gr->gr_gid, NULL, NULL);
     if (!gid) {
 
         return NULL;
@@ -159,7 +159,8 @@
     if (!gr)
         return NULL;
 
-    gid = ACR_DescriptorCreate(_E, 0, gr->gr_gid, NULL, NULL);
+    gid = ACR_DescriptorCreate(_E, ACR_DT_GROUP,
+                               gr->gr_gid, NULL, NULL);
     if (!gid) {
 
         return NULL;

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c Mon May 25 11:29:34 2009
@@ -131,7 +131,7 @@
     if (!pw)
         return NULL;
 
-    uid = ACR_DescriptorCreate(_E, 0, pw->pw_uid, NULL, NULL);
+    uid = ACR_DescriptorCreate(_E, ACR_DT_USER, pw->pw_uid, NULL, NULL);
     if (!uid) {
 
         return NULL;
@@ -181,7 +181,7 @@
     if (!pw)
         return NULL;
 
-    uid = ACR_DescriptorCreate(_E, 0, pw->pw_uid, NULL, NULL);
+    uid = ACR_DescriptorCreate(_E, ACR_DT_USER, pw->pw_uid, NULL, NULL);
     if (!uid) {
 
         return NULL;

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/group.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/group.c?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/group.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/group.c Mon May 25 11:29:34 2009
@@ -133,7 +133,8 @@
         return NULL;
     }
 
-    gid = ACR_DescriptorCreate(_E, 0, -1, sid, sid_descriptor_handler);
+    gid = ACR_DescriptorCreate(_E, ACR_DT_GROUP, -1,
+                               sid, sid_descriptor_handler);
     if (!gid) {
         free(sid);
         return NULL;
@@ -198,7 +199,8 @@
         free(sid);
         return NULL;
     }
-    gid = ACR_DescriptorCreate(_E, 0, -1, sid, sid_descriptor_handler);
+    gid = ACR_DescriptorCreate(_E, ACR_DT_GROUP, -1,
+                               sid, sid_descriptor_handler);
     if (!gid) {
         free(sid);
         return NULL;

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/user.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/user.c?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/user.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/user.c Mon May 25 11:29:34 2009
@@ -147,7 +147,8 @@
         return NULL;
     }
 
-    uid = ACR_DescriptorCreate(_E, 0, -1, sid, sid_descriptor_handler);
+    uid = ACR_DescriptorCreate(_E, ACR_DT_USER, -1,
+                               sid, sid_descriptor_handler);
     if (!uid) {
         free(sid);
         return NULL;
@@ -226,7 +227,8 @@
         return NULL;
     }
 
-    uid = ACR_DescriptorCreate(_E, 0, -1, sid, sid_descriptor_handler);
+    uid = ACR_DescriptorCreate(_E, ACR_DT_USER, -1,
+                               sid, sid_descriptor_handler);
     if (!uid) {
         free(sid);
         return NULL;

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c Mon May 25 11:29:34 2009
@@ -83,6 +83,12 @@
     "I"
 };
 
+J_DECLARE_F_ID(0004) = {
+    NULL,
+    "IDFLAGS",
+    "I"
+};
+
 ACR_CLASS_LDEF(Descriptor)
 {
     int rv;
@@ -93,6 +99,7 @@
     J_LOAD_IFIELD(0001);
     J_LOAD_IFIELD(0002);
     J_LOAD_IFIELD(0003);
+    J_LOAD_IFIELD(0004);
     J_LOAD_METHOD(0000);
 
     return ACR_SUCCESS;
@@ -124,8 +131,10 @@
     if (!_clazzn.i) {
         initd0(_E);
     }
-    nd = ACR_DescriptorCreate(_E, ACR_EBADF, -1, NULL, NULL);
-
+    nd = ACR_DescriptorCreate(_E, 0, -1, NULL, NULL);
+    if (nd && _clazzn.i && J4MID(0000)) {
+        SET_IFIELD_I(0003, nd, ACR_EBADF);
+    }
     return nd;
 }
 
@@ -201,12 +210,12 @@
 
 }
 
-ACR_DECLARE(jobject) ACR_DescriptorCreate(JNIEnv *_E, int e, int i, void *p,
+ACR_DECLARE(jobject) ACR_DescriptorCreate(JNIEnv *_E, int f, int i, void *p,
                                           acr_descriptor_handler_fn_t *cb)
 {
     if (_clazzn.i && J4MID(0000))
         return (*_E)->NewObject(_E, _clazzn.i, J4MID(0000),
-                                (jint)e, (jint)i, P2N(p), P2N(cb));
+                                (jint)f, (jint)i, P2N(p), P2N(cb));
     else {
         ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
         return NULL;
@@ -286,6 +295,17 @@
     }
 }
 
+ACR_DECLARE(int) ACR_DescriptorFlags(ACR_JNISTDARGS)
+{
+    if (_clazzn.i && J4MID(0000)) {
+        return GET_IFIELD_I(0004, _O);
+    }
+    else {
+        ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
+        return -1;
+    }
+}
+
 ACR_DECLARE(int) ACR_DescriptorSetPtr(ACR_JNISTDARGS, void *p)
 {
     if (_clazzn.i && J4MID(0000)) {

Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Mon May 25 11:29:34 2009
@@ -255,7 +255,7 @@
 ACR_JNI_EXPORT_DECLARE(jobject, TestPrivate, test021)(ACR_JNISTDARGS, jint i, jint d)
 {
     
-    return  ACR_DescriptorCreate(_E, 0, i, I2P(d, void *), dhandler);
+    return  ACR_DescriptorCreate(_E, ACR_DT_SOCKET, i, I2P(d, void *), dhandler);
 }
 
 ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test022)(ACR_JNISTDARGS, jobject d)

Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=778391&r1=778390&r2=778391&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Mon May 25 11:29:34 2009
@@ -551,6 +551,20 @@
         Thread.sleep(200);
     }
 
+    public void testDescriptorType()
+        throws Throwable
+    {
+        Descriptor d = test021(2303, 0);
+        assertNotNull("Descriptor", d);
+        assertEquals("Type", d.getType(), DescriptorType.SOCKET);
+        d.close();
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
     public void testUtf16String()
         throws Throwable
     {