Author: mturk
Date: Fri Mar 25 11:16:39 2011
New Revision: 1085321
URL: http://svn.apache.org/viewvc?rev=1085321&view=rev
Log:
Add more Unsafe methods
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java?rev=1085321&r1=1085320&r2=1085321&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
(original)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
Fri Mar 25 11:16:39 2011
@@ -15,6 +15,7 @@
*/
package org.apache.commons.runtime;
+import java.lang.reflect.Field;
/**
* Wrapper over sun.misc.Unsafe.
@@ -30,8 +31,11 @@ public final class Unsafe
// No instance.
}
- private static final Object unsafe;
+ private static final Object unsafe;
private static native Object get0();
+ private static native int get1(Field f);
+ private static native int get2(Field f);
+ private static native int get3(Field f);
static {
unsafe = get0();
}
@@ -45,7 +49,40 @@ public final class Unsafe
}
public static Object getInstance()
+ throws UnsupportedOperationException
{
+ if (unsafe == null)
+ throw new UnsupportedOperationException();
return unsafe;
}
+
+ public static int objectFieldOffset(Field field)
+ throws UnsupportedOperationException, IllegalArgumentException
+ {
+ if (unsafe == null)
+ throw new UnsupportedOperationException();
+ if (field == null)
+ throw new IllegalArgumentException();
+ return get1(field);
+ }
+
+ public static int staticFieldBase(Field field)
+ throws UnsupportedOperationException, IllegalArgumentException
+ {
+ if (unsafe == null)
+ throw new UnsupportedOperationException();
+ if (field == null)
+ throw new IllegalArgumentException();
+ return get2(field);
+ }
+
+ public static int staticFieldOffset(Field field)
+ throws UnsupportedOperationException, IllegalArgumentException
+ {
+ if (unsafe == null)
+ throw new UnsupportedOperationException();
+ if (field == null)
+ throw new IllegalArgumentException();
+ return get3(field);
+ }
}
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c?rev=1085321&r1=1085320&r2=1085321&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c Fri Mar 25
11:16:39 2011
@@ -50,6 +50,12 @@ J_DECLARE_M_ID(0002) = {
J_DECLARE_M_ID(0003) = {
0,
+ "staticFieldBase",
+ "(Ljava/lang/reflect/Field;)J"
+};
+
+J_DECLARE_M_ID(0004) = {
+ 0,
"staticFieldOffset",
"(Ljava/lang/reflect/Field;)J"
};
@@ -67,6 +73,7 @@ ACR_CLASS_CTOR(Unsafe)
J_LOAD_METHOD(0001);
J_LOAD_METHOD(0002);
J_LOAD_METHOD(0003);
+ J_LOAD_METHOD(0004);
return 0;
}
@@ -78,8 +85,8 @@ ACR_CLASS_DTOR(Unsafe)
static jobject _unsafe_instance = 0;
-jobject
-AcrUnsafeGetInstance(JNI_STDENV)
+ACR_INLINE(jobject)
+_get_unsafe(JNI_STDENV)
{
if (_unsafe_instance == 0 && _clazzn.i != 0) {
_unsafe_instance = GET_SFIELD_O(0000, _clazzn.i);
@@ -87,41 +94,82 @@ AcrUnsafeGetInstance(JNI_STDENV)
return _unsafe_instance;
}
-jlong
+jint
AcrUnsafeObjectFieldOffset(JNI_STDARGS)
{
- if (AcrUnsafeGetInstance(_E) == 0) {
+ jlong fo;
+ if (_get_unsafe(_E) == 0) {
+ return 0;
+ }
+ fo = CALL_METHOD1(Long, 0002, _unsafe_instance, _O);
+ if (fo > 0 && fo < INT_MAX)
+ return (jint)fo;
+ else
+ return 0;
+}
+
+jint
+AcrUnsafeStaticFieldBase(JNI_STDARGS)
+{
+ jlong fo;
+ if (_get_unsafe(_E) == 0) {
return 0;
}
- return CALL_METHOD1(Long, 0002, _unsafe_instance, _O);
+ fo = CALL_METHOD1(Long, 0003, _unsafe_instance, _O);
+ if (fo > 0 && fo < INT_MAX)
+ return (jint)fo;
+ else
+ return 0;
}
-jlong
+jint
AcrUnsafeStaticFieldOffset(JNI_STDARGS)
{
- if (AcrUnsafeGetInstance(_E) == 0) {
+ jlong fo;
+ if (_get_unsafe(_E) == 0) {
return 0;
}
- return CALL_METHOD1(Long, 0003, _unsafe_instance, _O);
+ fo = CALL_METHOD1(Long, 0004, _unsafe_instance, _O);
+ if (fo > 0 && fo < INT_MAX)
+ return (jint)fo;
+ else
+ return 0;
}
ACR_JNI_EXPORT(jobject, Unsafe, get0)(JNI_STDARGS)
{
- return AcrUnsafeGetInstance(_E);
+ return _get_unsafe(_E);
+}
+
+ACR_JNI_EXPORT(jint, Unsafe, get1)(JNI_STDARGS, jobject field)
+{
+ return AcrUnsafeObjectFieldOffset(_E, field);
+}
+
+ACR_JNI_EXPORT(jint, Unsafe, get2)(JNI_STDARGS, jobject field)
+{
+ return AcrUnsafeStaticFieldBase(_E, field);
+}
+
+ACR_JNI_EXPORT(jint, Unsafe, get3)(JNI_STDARGS, jobject field)
+{
+ return AcrUnsafeStaticFieldOffset(_E, field);
}
#if defined(ENABLE_TEST_PRIVATE)
-ACR_JNI_EXPORT(jint, TestUnsafe, get0)(JNI_STDARGS, jobject o, jlong off)
+ACR_JNI_EXPORT(jint, TestUnsafe, get0)(JNI_STDARGS, jobject o, jint off)
{
- if (o != 0) {
- char *ob = (*(char **)o + (ptrdiff_t)off);
- return *((jint *)ob);
+ if (o != 0 && off > 0) {
+ char *oa = *(char **)o;
+ if (oa != 0) {
+ char *fa = (oa + (ptrdiff_t)off);
+ return *((jint *)fa);
+ }
}
- else
- return 0;
+ return 0;
}
-ACR_JNI_EXPORT(jlong, TestUnsafe, get1)(JNI_STDARGS, jobject o)
+ACR_JNI_EXPORT(jint, TestUnsafe, get1)(JNI_STDARGS, jobject o)
{
return AcrUnsafeObjectFieldOffset(_E, o);
}