Mercurial > hg > Members > kono > jpf-core
diff src/classes/sun/misc/Unsafe.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/classes/sun/misc/Unsafe.java Fri Jan 23 10:14:01 2015 -0800 @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2014, United States Government, as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All rights reserved. + * + * The Java Pathfinder core (jpf-core) platform is licensed 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 sun.misc; + +import java.lang.reflect.Field; + +/** + * Unsafe = unwanted. See comments in the native peer. We only have it because + * it is required by java.util.concurrent. + * + * Note that in the real world, this class is only callable from the system library, + * not application code + */ + +public class Unsafe { + private static final Unsafe theUnsafe = new Unsafe(); + + public static final int INVALID_FIELD_OFFSET = -1; + + public static Unsafe getUnsafe() { + return theUnsafe; + //return new Unsafe(); + } + + // field offsets are completely useless between VMs, we just return + // a numeric id for the corresponding FieldInfo here + public native int fieldOffset (Field f); + public native long objectFieldOffset (Field f); + + // those do the usual CAS magic + public native boolean compareAndSwapObject (Object oThis, long offset, Object expect, Object update); + public native boolean compareAndSwapInt (Object oThis, long offset, int expect, int update); + public native boolean compareAndSwapLong (Object oThis, long offset, long expect, long update); + + // that looks like some atomic conditional wait + public native void park (boolean isAbsolute, long timeout); + public native void unpark (Object thread); + + // various accessors + public native int getInt(Object obj, long l); + public native int getIntVolatile(Object obj, long l); + + @Deprecated + public int getInt(Object obj, int offset) { + return getInt(obj, (long) offset); + } + + public native void putInt(Object obj, long l, int i); + public native void putIntVolatile(Object obj, long l, int i); + + @Deprecated + public void putInt(Object obj, int offset, int i) { + putInt(obj, (long) offset, i); + } + + public native void putOrderedInt(Object obj, long l, int i); + + public native Object getObject(Object obj, long l); + public native Object getObjectVolatile(Object obj, long l); + + @Deprecated + public Object getObject(Object obj, int offset) { + return getObject(obj, (long) offset); + } + + public native void putObject(Object obj, long l, Object obj1); + public native void putObjectVolatile(Object obj, long l, Object obj1); + + + @Deprecated + public void putObject(Object obj, int offset, Object obj1) { + putObject(obj, (long) offset, obj1); + } + + public native void putOrderedObject(Object obj, long l, Object obj1); + + public native boolean getBoolean(Object obj, long l); + public native boolean getBooleanVolatile(Object obj, long l); + + @Deprecated + public boolean getBoolean(Object obj, int offset) { + return getBoolean(obj, (long) offset); + } + + public native void putBoolean(Object obj, long l, boolean flag); + public native void putBooleanVolatile(Object obj, long l, boolean flag); + + @Deprecated + public void putBoolean(Object obj, int offset, boolean flag) { + putBoolean(obj, (long) offset, flag); + } + + public native byte getByte(Object obj, long l); + public native byte getByteVolatile(Object obj, long l); + + @Deprecated + public byte getByte(Object obj, int offset) { + return getByte(obj, (long) offset); + } + + public native void putByte(Object obj, long l, byte byte0); + public native void putByteVolatile(Object obj, long l, byte byte0); + + @Deprecated + public void putByte(Object obj, int offset, byte byte0) { + putByte(obj, (long) offset, byte0); + } + + public native short getShort(Object obj, long l); + public native short getShortVolatile(Object obj, long l); + + @Deprecated + public short getShort(Object obj, int offset) { + return getShort(obj, (long) offset); + } + + public native void putShort(Object obj, long l, short word0); + public native void putShortVolatile(Object obj, long l, short word0); + + @Deprecated + public void putShort(Object obj, int offset, short word0) { + putShort(obj, (long) offset, word0); + } + + public native char getChar(Object obj, long l); + public native char getCharVolatile(Object obj, long l); + + @Deprecated + public char getChar(Object obj, int offset) { + return getChar(obj, (long) offset); + } + + public native void putChar(Object obj, long l, char c); + public native void putCharVolatile(Object obj, long l, char c); + + @Deprecated + public void putChar(Object obj, int offset, char c) { + putChar(obj, (long) offset, c); + } + + public native long getLong(Object obj, long l); + public native long getLongVolatile(Object obj, long l); + + @Deprecated + public long getLong(Object obj, int offset) { + return getLong(obj, (long) offset); + } + + public native void putLong(Object obj, long l, long l1); + public native void putLongVolatile(Object obj, long l, long l1); + + public native void putOrderedLong(Object obj, long l, long l1); + + @Deprecated + public void putLong(Object obj, int offset, long l1) { + putLong(obj, (long) offset, l1); + } + + public native float getFloat(Object obj, long l); + public native float getFloatVolatile(Object obj, long l); + + @Deprecated + public float getFloat(Object obj, int offset) { + return getFloat(obj, (long) offset); + } + + public native void putFloat(Object obj, long l, float f); + public native void putFloatVolatile(Object obj, long l, float f); + + @Deprecated + public void putFloat(Object obj, int offset, float f) { + putFloat(obj, (long) offset, f); + } + + public native double getDouble(Object obj, long l); + public native double getDoubleVolatile(Object obj, long l); + + @Deprecated + public double getDouble(Object obj, int offset) { + return getDouble(obj, (long) offset); + } + + public native void putDouble(Object obj, long l, double d); + public native void putDoubleVolatile(Object obj, long l, double d); + + @Deprecated + public void putDouble(Object obj, int offset, double d) { + putDouble(obj, (long) offset, d); + } + + public native void ensureClassInitialized(Class<?> cls); + + public native int arrayBaseOffset(Class<?> clazz); + + public native int arrayIndexScale(Class<?> clazz); + + + //--- java.nio finally breaks object boundaries - hello, evil pointer arithmetic + + /** + * this is really a byte[] allocation (used by java.nio.Bits). Note that + * object has to be explicitly freed with freeMemory() (yikes!) + */ + public native long allocateMemory (long bytes); + + /** + * to be used to free allocateMemory() allocated array objects + */ + public native void freeMemory (long byteArrayRef); + + /** + * byte access of allocateMemory() objects. Note that 'address' has + * to point into such an object + */ + public native byte getByte (long address); + public native void putByte (long address, byte val); + + public native char getChar (long address); + public native void putChar (long address, char val); + + public native int getInt (long address); + public native void putInt (long address, int val); + + public native long getLong (long address); + public native void putLong (long address, long val); + + public native float getFloat (long address); + public native void putFloat (long address, float val); + + public native double getDouble (long address); + public native void putDouble (long address, double val); + +}