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/04/17 12:17:35 UTC

svn commit: r765931 - in /commons/sandbox/runtime/trunk/src: main/java/org/apache/commons/runtime/ main/native/ main/native/include/ main/native/shared/ main/native/test/ test/org/apache/commons/runtime/

Author: mturk
Date: Fri Apr 17 10:17:34 2009
New Revision: 765931

URL: http://svn.apache.org/viewvc?rev=765931&view=rev
Log:
Add Descriptor classes that encapsulate the OS object handles

Added:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java   (with props)
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java   (with props)
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java   (with props)
    commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h   (with props)
    commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/native/Makefile.in
    commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
    commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h
    commons/sandbox/runtime/trunk/src/main/native/shared/error.c
    commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c
    commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java

Added: 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=765931&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor.java Fri Apr 17 10:17:34 2009
@@ -0,0 +1,97 @@
+/* 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;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.SyncFailedException;
+
+/** Represents the Operating System object descriptor.
+ * <p>
+ * Object descriptors represent the allocated system resource that
+ * can be of any type supported. Such objects are {@code files} ,
+ * {@code sockets} , {@code processes} etc...
+ * </p>
+ * <p>
+ * Descriptor is Operating system dependent usually encapsulating
+ * the {@code int} on unixes and {@code HANDLE} on Microsoft Windows.
+ * </p>
+ * @since Runtime 1.0
+ */
+public abstract class Descriptor implements Closeable {
+
+    /*
+     * Descriptor can be only created from native code.
+     * Suppress any instantiation except form internal classes.
+     */
+    protected  Descriptor()
+    {
+        // No Instance
+    }
+
+    private native void close0()
+        throws IOException;
+
+    private native void sync0()
+        throws SyncFailedException, IOException;
+
+    /**
+     * 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.
+     */
+    protected final void finalize()
+        throws Throwable
+    {
+        close0();
+    }
+
+    /**
+     * Free the allocated resource by the Operating system.
+     * <p>
+     * Note that {@code Object.finalize()} method will call
+     * this function. However if the native code can block for
+     * long time explicit {@code close()} should be called.
+     * </p>
+     * @see java.io.Closeable#close()
+     * @throws IOException if an I/O error occurs.
+     */
+    public final void close()
+        throws IOException
+    {
+        close0();
+    }
+
+    /**
+     * Force the underlying object to synchonize any buffered data.
+     * @throws SyncFailedException when the object cannot be flushed.
+     * @throws IOException if an I/O error occurs.
+     */
+    public final void sync()
+        throws SyncFailedException, IOException
+    {
+        sync0();
+    }
+
+    /**
+     * Check if the underlying Operating system descriptor is closed.
+     * @return {@code true} if descriptor is closed {@code false} otherwise.
+     */
+    public abstract boolean isClosed();
+
+}

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

Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java?rev=765931&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor32.java Fri Apr 17 10:17:34 2009
@@ -0,0 +1,52 @@
+/* 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;
+
+/** Represents the Operating System 32-bit object descriptor.
+ * <p>
+ * IHANDLE always represents the posix int descriptor.
+ * LHANDLE represents the pointer if descriptor is pointer based
+ * </p>
+ * @since Runtime 1.0
+ */
+class Descriptor32 extends Descriptor {
+
+    private int     IHANDLE;
+    private int     PHANDLE;
+    private int     CLEANUP;
+
+    /*
+     * Descriptor can be only created from native code.
+     * Suppress any instantiation except form JNI.
+     */
+    protected Descriptor32(int i, int l, int c)
+    {
+        IHANDLE = i;
+        PHANDLE = l;
+        CLEANUP = c;
+    }
+
+    public boolean isClosed()
+    {
+        // true if both int is negative and pointer is NULL
+        if (IHANDLE < 0 && PHANDLE == 0)
+            return true;
+        else
+            return false;
+    }
+
+}

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

Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java?rev=765931&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Descriptor64.java Fri Apr 17 10:17:34 2009
@@ -0,0 +1,52 @@
+/* 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;
+
+/** Represents the Operating System 64-bit object descriptor.
+ * <p>
+ * IHANDLE always represents the posix int descriptor.
+ * LHANDLE represents the pointer if descriptor is pointer based
+ * </p>
+ * @since Runtime 1.0
+ */
+class Descriptor64 extends Descriptor {
+
+    private int     IHANDLE;
+    private long    PHANDLE;
+    private long    CLEANUP;
+
+    /*
+     * Descriptor can be only created from native code.
+     * Suppress any instantiation except form JNI.
+     */
+    private Descriptor64(int i, long l, long c)
+    {
+        IHANDLE = i;
+        PHANDLE = l;
+        CLEANUP = c;
+    }
+
+    public boolean isClosed()
+    {
+        // true if both int is negative and pointer is NULL
+        if (IHANDLE < 0 && PHANDLE == 0L)
+            return true;
+        else
+            return false;
+    }
+
+}

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

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.in
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.in?rev=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Fri Apr 17 10:17:34 2009
@@ -66,6 +66,7 @@
 COMMON_OBJS=\
 	$(SRCDIR)/shared/buildmark.$(OBJ) \
 	$(SRCDIR)/shared/clazz.$(OBJ) \
+	$(SRCDIR)/shared/descriptor.$(OBJ) \
 	$(SRCDIR)/shared/dbb.$(OBJ) \
 	$(SRCDIR)/shared/error.$(OBJ) \
 	$(SRCDIR)/shared/memory.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in?rev=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Fri Apr 17 10:17:34 2009
@@ -60,6 +60,7 @@
 COMMON_OBJS=\
 	$(SRCDIR)/shared/buildmark.$(OBJ) \
 	$(SRCDIR)/shared/clazz.$(OBJ) \
+	$(SRCDIR)/shared/descriptor.$(OBJ) \
 	$(SRCDIR)/shared/dbb.$(OBJ) \
 	$(SRCDIR)/shared/error.$(OBJ) \
 	$(SRCDIR)/shared/memory.$(OBJ) \

Added: 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=765931&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h (added)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h Fri Apr 17 10:17:34 2009
@@ -0,0 +1,85 @@
+/* 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.
+ */
+
+#ifndef _ACR_DESCRIPTOR_H
+#define _ACR_DESCRIPTOR_H
+
+#include "acr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file acr_descriptor.h
+ * @brief
+ *
+ * ACR Pointer class functions
+ *
+ */
+
+typedef enum {
+    ACR_DESC_CLOSE,
+    ACR_DESC_SYNC
+} acr_descriptor_cb_type_e;
+
+/**
+ * Descriptor callback function prototype.
+ * The callback function must check for data validity.
+ * Consecutive invocations will always contain NULL data.
+ */
+typedef int (acr_descriptor_callback_fn_t)(acr_descriptor_cb_type_e, int, void *);
+
+/**
+ * Create new Descriptor class instance
+ * @param env Current JNI environment
+ * @param i Native integer descriptor to wrap into Descriptor class
+ * @param p Native pointer descriptor to wrap into Descriptor class
+ * @param cb callback function to use
+ */
+ACR_DECLARE(jobject) ACR_DescriptorCreate(JNIEnv *env, int i, void *p,
+                                          acr_descriptor_callback_fn_t *cb);
+
+/**
+ * Call descriptor cleanup and clear Java object.
+ * @param env Current JNI environment
+ * @param obj Java Descriptor object to clean. The function will
+ * clear the callback and data inside Java object.
+ * @return ACR_INCOMPLETE if already cleared.
+ */
+ACR_DECLARE(int) ACR_DescriptorCleanup(JNIEnv *env, jobject obj);
+
+/**
+ * Get the native pointer from the Pointer object.
+ * @param env Current JNI environment
+ * @param obj Java Descriptor object use.
+ * @return Underlying wrapped integer descriptor.
+ */
+ACR_DECLARE(int) ACR_DescriptorGetInt(JNIEnv *env, jobject obj);
+
+/**
+ * Get the native pointer from the Pointer object.
+ * @param env Current JNI environment
+ * @param obj Java Descriptor object use.
+ * @return Underlying wrapped pointer descriptor.
+ */
+ACR_DECLARE(void *) ACR_DescriptorGetPtr(JNIEnv *env, jobject obj);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ACR_DESCRIPTOR_H */

Propchange: commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Fri Apr 17 10:17:34 2009
@@ -405,6 +405,7 @@
 #define ACR_EISNULL         (ACR_OS_START_ERROR + 100)
 #define ACR_EINVALSIZ       (ACR_OS_START_ERROR + 101)
 #define ACR_ERANGE          (ACR_OS_START_ERROR + 102)
+#define ACR_ECLASSNOTFOUND  (ACR_OS_START_ERROR + 103)
 
 /** 
  * @defgroup ACR_STATUS_IS Status Value Tests

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h?rev=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h Fri Apr 17 10:17:34 2009
@@ -36,7 +36,7 @@
  * The cleanup function must chech for data validity.
  * Consecutive invocations will always contain NULL data.
  */
-typedef int (acr_pointer_callback_fn_t)(void *);
+typedef int (acr_pointer_cleanup_fn_t)(void *);
 
 /**
  * Create new Pointer class instance
@@ -45,10 +45,10 @@
  * @param cb callback function to use on Pointer.finalize()
  */
 ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *env, void *p,
-                                       acr_pointer_callback_fn_t *cb);
+                                       acr_pointer_cleanup_fn_t *cb);
 
 /**
- * Call pointer cleanup.
+ * Call pointer cleanup and clear Java object.
  * @param env Current JNI environment
  * @param ptr Java Pointer object to clean. The function will
  * clear the callback and pointer inside Java object.

Added: 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=765931&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c Fri Apr 17 10:17:34 2009
@@ -0,0 +1,260 @@
+/* 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.
+ */
+
+/*
+ *
+ * @author Mladen Turk
+ */
+
+#include "acr.h"
+#include "acr_private.h"
+#include "acr_error.h"
+#include "acr_clazz.h"
+#include "acr_descriptor.h"
+
+/**
+ * Descriptor class utilities
+ */
+#if CC_SIZEOF_VOIDP == 8
+
+J_DECLARE_CLAZZ = {
+    NULL,
+    NULL,
+    ACR_CLASS_PATH "Descriptor64"
+};
+
+J_DECLARE_F_ID(0000) = {
+    NULL,
+    "IHANDLE",
+    "I"
+};
+
+J_DECLARE_F_ID(0001) = {
+    NULL,
+    "PHANDLE",
+    "J"
+};
+
+J_DECLARE_F_ID(0002) = {
+    NULL,
+    "CLEANUP",
+    "J"
+};
+
+J_DECLARE_M_ID(0000) = {
+    NULL,
+    "<init>",
+    "(IJJ)V"
+};
+
+#else
+
+J_DECLARE_CLAZZ = {
+    NULL,
+    NULL,
+    ACR_CLASS_PATH "Descriptor32"
+};
+
+J_DECLARE_F_ID(0000) = {
+    NULL,
+    "IHANDLE",
+    "I"
+};
+
+J_DECLARE_F_ID(0001) = {
+    NULL,
+    "PHANDLE",
+    "I"
+};
+
+J_DECLARE_F_ID(0002) = {
+    NULL,
+    "CLEANUP",
+    "I"
+};
+
+J_DECLARE_M_ID(0000) = {
+    NULL,
+    "<init>",
+    "(III)V"
+};
+
+#endif
+
+ACR_CLASS_LDEF(Descriptor)
+{
+    int rv;
+
+    if ((rv = ACR_LoadClass(_E, &_clazzn)) != ACR_SUCCESS)
+        return rv;
+    J_LOAD_IFIELD(0000);
+    J_LOAD_IFIELD(0001);
+    J_LOAD_IFIELD(0002);
+    J_LOAD_METHOD(0000);
+
+    return ACR_SUCCESS;
+}
+
+ACR_CLASS_UDEF(Descriptor)
+{
+    ACR_UnloadClass(_E, &_clazzn);
+}
+
+
+ACR_JNI_EXPORT_DECLARE(void, Descriptor, close0)(ACR_JNISTDARGS)
+{
+    acr_descriptor_callback_fn_t *callback;
+    jint  i = GET_IFIELD_I(0000, _O);
+#if CC_SIZEOF_VOIDP == 8
+    jlong p = GET_IFIELD_J(0001, _O);
+    jlong c = GET_IFIELD_J(0002, _O);
+
+    if (p) {
+        SET_IFIELD_J(0001, _O, 0);
+    }
+#else
+    jlong p = GET_IFIELD_I(0001, _O);
+    jlong c = GET_IFIELD_I(0002, _O);
+
+    if (p) {
+        SET_IFIELD_I(0001, _O, 0);
+    }
+#endif
+    if (i >= 0) {
+        SET_IFIELD_I(0000, _O, -1);
+    }
+
+    callback = (acr_descriptor_callback_fn_t *)((acr_ptr_t)c);
+    if (callback) {
+        int rc = (*callback)(ACR_DESC_CLOSE, i, (void *)((acr_ptr_t)p));
+        if (rc) {
+            /* Throw IOException with errno message */
+            ACR_ThrowException(_E, THROW_FMARK, ACR_EX_EIO, rc);
+        }
+    }
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Descriptor, sync0)(ACR_JNISTDARGS)
+{
+    acr_descriptor_callback_fn_t *callback;
+    jint  i = GET_IFIELD_I(0000, _O);
+#if CC_SIZEOF_VOIDP == 8
+    jlong p = GET_IFIELD_J(0001, _O);
+    jlong c = GET_IFIELD_J(0002, _O);
+
+#else
+    jlong p = GET_IFIELD_I(0001, _O);
+    jlong c = GET_IFIELD_I(0002, _O);
+
+#endif
+    callback = (acr_descriptor_callback_fn_t *)((acr_ptr_t)c);
+    if (callback) {
+        int rc = (*callback)(ACR_DESC_SYNC, i, (void *)((acr_ptr_t)p));
+        if (rc) {
+            if (rc == ACR_EINVAL)
+                ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESYNC, 0);
+            else
+                ACR_ThrowException(_E, THROW_FMARK, ACR_EX_EIO, rc);
+        }
+    }
+}
+
+ACR_DECLARE(jobject) ACR_DescriptorCreate(JNIEnv *_E, int i, void *p,
+                                          acr_descriptor_callback_fn_t *cb)
+{
+    if (_clazzn.i && _m0000n.i)
+        return (*_E)->NewObject(_E, _clazzn.i, _m0000n.i,
+                                (jint)i, (acr_ptr_t)p, (acr_ptr_t)cb);
+    else {
+        ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
+        return NULL;
+    }
+}
+
+ACR_DECLARE(int) ACR_DescriptorCleanup(ACR_JNISTDARGS)
+{
+    if (_clazzn.i && _m0000n.i) {
+        acr_descriptor_callback_fn_t *callback;
+        jint  i = GET_IFIELD_I(0000, _O);
+#if CC_SIZEOF_VOIDP == 8
+        jlong p = GET_IFIELD_J(0001, _O);
+        jlong c = GET_IFIELD_J(0002, _O);
+
+        if (p) {
+            SET_IFIELD_J(0001, _O, 0);
+        }
+        if (c) {
+            SET_IFIELD_J(0002, _O, 0);
+        }
+#else
+        jlong p = GET_IFIELD_I(0001, _O);
+        jlong c = GET_IFIELD_I(0002, _O);
+
+        if (p) {
+            SET_IFIELD_I(0001, _O, 0);
+        }
+        if (c) {
+            SET_IFIELD_I(0002, _O, 0);
+        }
+#endif
+        if (i >= 0) {
+            SET_IFIELD_I(0000, _O, -1);
+        }
+
+        callback = (acr_descriptor_callback_fn_t *)((acr_ptr_t)c);
+        if (callback) {
+            int rc = (*callback)(ACR_DESC_CLOSE, i, (void *)((acr_ptr_t)p));
+            if (rc) {
+                /* Throw IOException with errno message */
+                ACR_ThrowException(_E, THROW_FMARK, ACR_EX_EIO, rc);
+            }
+            return rc;
+        }
+        else {
+            /* Already cleared */
+            return ACR_INCOMPLETE;
+        }
+    }
+    else
+        return ACR_ECLASSNOTFOUND;
+}
+
+ACR_DECLARE(void *) ACR_DescriptorGetPtr(ACR_JNISTDARGS)
+{
+    if (_clazzn.i && _m0000n.i) {
+#if CC_SIZEOF_VOIDP == 8
+        jlong p = GET_IFIELD_J(0001, _O);
+#else
+        jint  p = GET_IFIELD_I(0001, _O);
+#endif
+        return (void *)((acr_ptr_t)p);
+    }
+    else {
+        ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
+        return NULL;
+    }
+}
+
+ACR_DECLARE(int) ACR_DescriptorGetInt(ACR_JNISTDARGS)
+{
+    if (_clazzn.i && _m0000n.i) {
+        return GET_IFIELD_I(0000, _O);
+    }
+    else {
+        ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
+        return -1;
+    }
+}

Propchange: commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/error.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/error.c?rev=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/error.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/error.c Fri Apr 17 10:17:34 2009
@@ -232,6 +232,8 @@
         return "The given argument size is invalid";
     case ACR_ERANGE:
         return "The given argument is out of range";
+    case ACR_ECLASSNOTFOUND:
+        return "The specified Java Class was not found";
     default:
         return "Error string not specified yet";
     }

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c?rev=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c Fri Apr 17 10:17:34 2009
@@ -103,7 +103,7 @@
 
 ACR_JNI_EXPORT_DECLARE(void, Pointer, cleanup0)(ACR_JNISTDARGS)
 {
-    acr_pointer_callback_fn_t *cleanup;
+    acr_pointer_cleanup_fn_t *cleanup;
 #if CC_SIZEOF_VOIDP == 8
     jlong h = GET_IFIELD_J(0000, _O);
     jlong c = GET_IFIELD_J(0001, _O);
@@ -119,7 +119,7 @@
         SET_IFIELD_I(0000, _O, 0);
     }
 #endif
-    cleanup = (acr_pointer_callback_fn_t *)((acr_ptr_t)c);
+    cleanup = (acr_pointer_cleanup_fn_t *)((acr_ptr_t)c);
     if (cleanup) {
         int rc = (*cleanup)((void *)((acr_ptr_t)h));
         if (rc) {
@@ -130,19 +130,21 @@
 }
 
 ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *_E, void *p,
-                                       acr_pointer_callback_fn_t *cb)
+                                       acr_pointer_cleanup_fn_t *cb)
 {
     if (_clazzn.i && _m0000n.i)
         return (*_E)->NewObject(_E, _clazzn.i, _m0000n.i,
                                 (acr_ptr_t)p, (acr_ptr_t)cb);
-    else
+    else {
+        ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
         return NULL;
+    }
 }
 
 ACR_DECLARE(int) ACR_PointerCleanup(ACR_JNISTDARGS)
 {
     if (_clazzn.i && _m0000n.i) {
-        acr_pointer_callback_fn_t *cleanup;
+        acr_pointer_cleanup_fn_t *cleanup;
 #if CC_SIZEOF_VOIDP == 8
         jlong h = GET_IFIELD_J(0000, _O);
         jlong c = GET_IFIELD_J(0001, _O);
@@ -164,7 +166,7 @@
             SET_IFIELD_I(0001, _O, 0);
         }
 #endif
-        cleanup = (acr_pointer_callback_fn_t *)((acr_ptr_t)c);
+        cleanup = (acr_pointer_cleanup_fn_t *)((acr_ptr_t)c);
         if (cleanup) {
             int rc = (*cleanup)((void *)((acr_ptr_t)h));
             if (rc) {
@@ -179,7 +181,7 @@
         }
     }
     else
-        return ACR_ESYMNOTFOUND;
+        return ACR_ECLASSNOTFOUND;
 }
 
 ACR_DECLARE(void *) ACR_PointerGet(ACR_JNISTDARGS)
@@ -192,6 +194,8 @@
 #endif
         return (void *)((acr_ptr_t)h);
     }
-    else
+    else {
+        ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
         return NULL;
+    }
 }

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=765931&r1=765930&r2=765931&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Fri Apr 17 10:17:34 2009
@@ -24,6 +24,7 @@
 #include "acr_vm.h"
 #include "acr_clazz.h"
 #include "acr_pointer.h"
+#include "acr_descriptor.h"
 
 
 /**
@@ -234,3 +235,41 @@
     void *v = ACR_PointerGet(_E, p);
     return v != NULL;
 }
+
+ACR_CLASS_LDEC(Descriptor);
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test020)(ACR_JNISTDARGS, jint d)
+{
+    ACR_CLASS_LRUN(Descriptor);
+    return 0;
+}
+
+static int dcallback(acr_descriptor_cb_type_e t, int i, void *p)
+{
+    fprintf(stderr, "[native] Descriptor callback(%d) called: %d/%p\n", t, i, p);
+    fflush(stderr);
+    return 0;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, TestPrivate, test021)(ACR_JNISTDARGS, jint i, jint d)
+{
+    
+    return  ACR_DescriptorCreate(_E, i, (void *)d, dcallback);
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test022)(ACR_JNISTDARGS, jobject d)
+{
+    
+    return  ACR_DescriptorCleanup(_E, d);
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test023)(ACR_JNISTDARGS, jobject d)
+{
+    void *v = ACR_DescriptorGetPtr(_E, d);
+    return v != NULL;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test024)(ACR_JNISTDARGS, jobject d)
+{
+    return ACR_DescriptorGetInt(_E, 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=765931&r1=765930&r2=765931&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 Fri Apr 17 10:17:34 2009
@@ -56,11 +56,19 @@
     private static native int   test013(int d);
     private static native Class test014(int d);
     private static native String[] test015(int d);
+    // Pointer
     private static native int   test016(int d);
     private static native Pointer test017(int d);
     private static native int   test018(Pointer p);
     private static native int   test019(Pointer p);
 
+    // Descriptor
+    private static native int   test020(int d);
+    private static native Descriptor test021(int i, int d);
+    private static native int   test022(Descriptor p);
+    private static native int   test023(Descriptor p);
+    private static native int   test024(Descriptor p);
+
 
     protected void setUp()
         throws Exception
@@ -235,7 +243,8 @@
         throws Throwable
     {
         Pointer p = test017(0xcafebabe);
-        assertNotNull("Pointer",p);
+        assertNotNull("Pointer", p);
+        assertFalse("IsNull", p.IsNull());
         p.free();
         p = null;
         System.gc();
@@ -262,7 +271,7 @@
         throws Throwable
     {
         Pointer p = test017(0xcafebabe);
-        assertNotNull("Pointer",p);
+        assertNotNull("Pointer", p);
         int r = test018(p);
         assertEquals("Result ", 0, r);
         int c = test018(p);
@@ -281,7 +290,7 @@
         throws Throwable
     {
         Pointer p = test017(0xcafebabe);
-        assertNotNull("Pointer",p);
+        assertNotNull("Pointer", p);
         int r = test019(p);
         assertEquals("Result ", 1, r);
         p.free();
@@ -296,4 +305,128 @@
         Thread.sleep(200);
     }
 
+    public void testDescClassLoad()
+        throws Exception
+    {
+        int i = test020(0);
+        assertEquals("Value", 0, i);
+    }
+
+    public void testDescriptorCb()
+        throws Throwable
+    {
+        Descriptor d = test021(2303, 0xcafebabe);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        d.close();
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
+    public void testDescriptorInt()
+        throws Throwable
+    {
+        Descriptor d = test021(2303, 0);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        d.close();
+        assertTrue("Closed", d.isClosed());
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
+    public void testDescriptorPtr()
+        throws Throwable
+    {
+        Descriptor d = test021(-1, 0xcafebabe);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        d.close();
+        assertTrue("Closed", d.isClosed());
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
+    public void testDescriptorGc()
+        throws Throwable
+    {
+        Descriptor d = test021(2303, 0xcafebabe);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        d = null;
+        System.gc();
+        // This should be enough for a first invocation
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
+    public void testDescriptorNativeClr()
+        throws Throwable
+    {
+        Descriptor d = test021(2303, 0xcafebabe);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        int r = test022(d);
+        assertEquals("Result ", 0, r);
+        int c = test022(d);
+        // 70008 is ACR_INCLOMPLETE */
+        assertEquals("Result ", 70008, c);
+
+        d.close();
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
+    public void testDescriptorNativePtrGet()
+        throws Throwable
+    {
+        Descriptor d = test021(-1, 0xcafebabe);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        int r = test023(d);
+        assertEquals("Result ", 1, r);
+        d.close();
+        int c = test023(d);
+        // Second call must return NULL
+        assertEquals("Result ", 0, c);
+
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
+    public void testDescriptorNativeIntGet()
+        throws Throwable
+    {
+        Descriptor d = test021(2303, 0);
+        assertNotNull("Descriptor", d);
+        assertFalse("Closed", d.isClosed());
+        int r = test024(d);
+        assertEquals("Result ", 2303, r);
+        d.close();
+        int c = test024(d);
+        // Second call must return -1
+        assertEquals("Result ", -1, c);
+
+        d = null;
+        System.gc();
+        // This should be enough for a gc
+        // from Pointer.finalize()
+        Thread.sleep(200);
+    }
+
 }