|
From: <ls...@us...> - 2007-06-30 13:33:27
|
Revision: 3338
http://jnode.svn.sourceforge.net/jnode/?rev=3338&view=rev
Author: lsantha
Date: 2007-06-30 06:33:24 -0700 (Sat, 30 Jun 2007)
Log Message:
-----------
Support for sun.misc.Unsafe .
Modified Paths:
--------------
trunk/core/src/openjdk/vm/sun/misc/NativeUnsafe.java
Added Paths:
-----------
trunk/core/src/openjdk/vm/sun/misc/UnsafeHelper.java
Modified: trunk/core/src/openjdk/vm/sun/misc/NativeUnsafe.java
===================================================================
--- trunk/core/src/openjdk/vm/sun/misc/NativeUnsafe.java 2007-06-30 11:58:44 UTC (rev 3337)
+++ trunk/core/src/openjdk/vm/sun/misc/NativeUnsafe.java 2007-06-30 13:33:24 UTC (rev 3338)
@@ -5,6 +5,8 @@
import java.lang.reflect.Field;
import java.security.ProtectionDomain;
+import org.vmmagic.unboxed.ObjectReference;
+import org.vmmagic.unboxed.Address;
/**
* @author Levente S\xE1ntha
@@ -175,7 +177,7 @@
}
public static long objectFieldOffset(Unsafe instance, Field f) {
- throw new UnsupportedOperationException();
+ return UnsafeHelper.objectFieldOffset(f);
}
public static Object staticFieldBase(Unsafe instance, Field f) {
@@ -235,23 +237,41 @@
throw new UnsupportedOperationException();
}
-
- public static final boolean compareAndSwapObject(Unsafe instance, Object o, long offset,
- Object expected,
- Object x) {
- throw new UnsupportedOperationException();
+ public static boolean compareAndSwapObject(Unsafe instance, Object o, long offset,
+ Object expected, Object x) {
+ //todo make sure it's atomic
+ final Address address = ObjectReference.fromObject(o).toAddress().add((int) offset);
+ if(address.loadObjectReference().toObject() == expected){
+ address.store(ObjectReference.fromObject(x));
+ return true;
+ } else {
+ return false;
+ }
}
- public static final boolean compareAndSwapInt(Unsafe instance, Object o, long offset,
- int expected,
- int x) {
- throw new UnsupportedOperationException();
+ public static boolean compareAndSwapInt(Unsafe instance, Object o, long offset,
+ int expected, int x) {
+ //todo make sure it's atomic
+ final Address address = ObjectReference.fromObject(o).toAddress().add((int) offset);
+ if(address.loadInt() == expected){
+ address.store(x);
+ return true;
+ } else {
+ return false;
+ }
}
public static final boolean compareAndSwapLong(Unsafe instance, Object o, long offset,
long expected,
long x) {
- throw new UnsupportedOperationException();
+ //todo make sure it's atomic
+ final Address address = ObjectReference.fromObject(o).toAddress().add((int) offset);
+ if(address.loadLong() == expected){
+ address.store(x);
+ return true;
+ } else {
+ return false;
+ }
}
public static Object getObjectVolatile(Unsafe instance, Object o, long offset) {
Added: trunk/core/src/openjdk/vm/sun/misc/UnsafeHelper.java
===================================================================
--- trunk/core/src/openjdk/vm/sun/misc/UnsafeHelper.java (rev 0)
+++ trunk/core/src/openjdk/vm/sun/misc/UnsafeHelper.java 2007-06-30 13:33:24 UTC (rev 3338)
@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ */
+package sun.misc;
+
+import java.lang.reflect.Field;
+import org.jnode.vm.classmgr.VmInstanceField;
+import org.vmmagic.unboxed.ObjectReference;
+
+/**
+ * @author Levente S\xE1ntha
+ */
+class UnsafeHelper {
+ private static final int OFFSET_OF_vmField_IN_Field =
+ ((VmInstanceField) Field.class.getVmClass().getField("vmField")).getOffset();
+ private static final int OFFSET_OF_offset_IN_VmInstanceField =
+ ((VmInstanceField) VmInstanceField.class.getVmClass().getField("offset")).getOffset();
+
+ static long objectFieldOffset(Field f) {
+ return ObjectReference.fromObject(f).toAddress().
+ add(OFFSET_OF_vmField_IN_Field).loadAddress().
+ add(OFFSET_OF_offset_IN_VmInstanceField).loadInt();
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|