Skip to content

Commit

Permalink
FIX for Unsafe class (#447)
Browse files Browse the repository at this point in the history
* add and implement native method compareAndSetReference and also adjust the compareAndSetObject method to call compareAndSetReference method

* Add and implement put related reference methods
  • Loading branch information
eklaDFF authored Apr 27, 2024
1 parent 2945e49 commit 505f0a2
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 24 deletions.
44 changes: 36 additions & 8 deletions src/classes/modules/java.base/jdk/internal/misc/Unsafe.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,9 @@ public final long getLongUnaligned(Object o, long offset) {

public final native boolean compareAndSetLong(Object o, long offset, long expected, long x);

public final native boolean compareAndSetObject(Object o, long offset, Object expected, Object x);
public final boolean compareAndSetObject(Object o, long offset, Object expected, Object x) {
return compareAndSetReference(o, offset, expected, x);
}

// those do the usual CAS magic
public native boolean compareAndSwapObject(Object oThis, long offset, Object expect,
Expand Down Expand Up @@ -192,9 +194,33 @@ 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);

public final void putObject(Object o, long offset, Object x) {
putReference(o, offset, x);
}

public final void putObjectOpaque(Object o, long offset, Object x) {
putReferenceOpaque(o, offset, x);
}

public final void putObjectRelease(Object o, long offset, Object x) {
putReferenceRelease(o, offset, x);
}
public final void putObjectVolatile(Object o, long offset, Object x) {
putReferenceVolatile(o, offset, x);
}

public native void putReference(Object o, long offset, Object x);


public final void putReferenceOpaque(Object o, long offset, Object x) {
putReferenceVolatile(o, offset, x);
}

public final void putReferenceRelease(Object o, long offset, Object x) {
putReferenceVolatile(o, offset, x);
}

public native void putReferenceVolatile(Object o, long offset, Object x);

@Deprecated
public void putObject(Object obj, int offset, Object obj1) {
Expand Down Expand Up @@ -227,6 +253,12 @@ public byte getByte(Object obj, int offset) {
return getByte(obj, (long) offset);
}

public final Object getReferenceAcquire(Object o, long offset) {
return getObject(o,offset);
}

public final native boolean compareAndSetReference(Object o, long offset, Object expected, Object x);

public native void putByte(Object obj, long l, byte byte0);
public native void putByteVolatile(Object obj, long l, byte byte0);

Expand Down Expand Up @@ -323,10 +355,6 @@ public void putDouble(Object obj, int offset, double d) {

public native int arrayIndexScale(Class<?> clazz);

public final void putObjectRelease(Object o, long offset, Object x) {
putObjectVolatile(o, offset, x);
}

//--- java.nio finally breaks object boundaries - hello, evil pointer arithmetic

/**
Expand Down
25 changes: 9 additions & 16 deletions src/peers/gov/nasa/jpf/vm/JPF_jdk_internal_misc_Unsafe.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,6 @@

import gov.nasa.jpf.JPFException;
import gov.nasa.jpf.annotation.MJI;
import gov.nasa.jpf.vm.ArrayFields;
import gov.nasa.jpf.vm.ElementInfo;
import gov.nasa.jpf.vm.FieldInfo;
import gov.nasa.jpf.vm.MJIEnv;
import gov.nasa.jpf.vm.NativePeer;
import gov.nasa.jpf.vm.SystemState;
import gov.nasa.jpf.vm.ThreadInfo;

import static gov.nasa.jpf.vm.JPF_java_lang_Class.FIELD_CLASSNAME;

Expand Down Expand Up @@ -107,13 +100,13 @@ public long objectFieldOffset__Ljava_lang_Class_2Ljava_lang_String_2__J (MJIEnv
}

/**
* NativePeer method for {@link jdk.internal.misc.Unsafe#compareAndSetObject(java.lang.Object, long, java.lang.Object, java.lang.Object)}
* NativePeer method for {@link jdk.internal.misc.Unsafe#compareAndSetReference(java.lang.Object, long, java.lang.Object, java.lang.Object)}
*/
@MJI
public boolean compareAndSetObject__Ljava_lang_Object_2JLjava_lang_Object_2Ljava_lang_Object_2__Z(MJIEnv env, int unsafeRef, int oRef, long offset, int expectedRef, int xRef) {
public boolean compareAndSetReference__Ljava_lang_Object_2JLjava_lang_Object_2Ljava_lang_Object_2__Z(MJIEnv env, int unsafeRef, int oRef, long offset, int expectedRef, int xRef) {
int actual = getObject__Ljava_lang_Object_2J__Ljava_lang_Object_2(env, unsafeRef, oRef, offset);
if (actual == expectedRef) {
putObject__Ljava_lang_Object_2JLjava_lang_Object_2__V(env, unsafeRef, oRef, offset, xRef);
putReference__Ljava_lang_Object_2JLjava_lang_Object_2__V(env, unsafeRef, oRef, offset, xRef);
return true;
}
return false;
Expand Down Expand Up @@ -165,7 +158,7 @@ public boolean compareAndSwapObject__Ljava_lang_Object_2JLjava_lang_Object_2Ljav
int expectRef, int updateRef) {
int actual = getObject__Ljava_lang_Object_2J__Ljava_lang_Object_2(env, unsafeRef, objRef, fieldOffset);
if (actual == expectRef) {
putObject__Ljava_lang_Object_2JLjava_lang_Object_2__V(env, unsafeRef, objRef, fieldOffset, updateRef);
putReference__Ljava_lang_Object_2JLjava_lang_Object_2__V(env, unsafeRef, objRef, fieldOffset, updateRef);
return true;
}
return false;
Expand Down Expand Up @@ -303,10 +296,10 @@ public int getObject__Ljava_lang_Object_2J__Ljava_lang_Object_2 (MJIEnv env, int
public int getObjectVolatile__Ljava_lang_Object_2J__Ljava_lang_Object_2 (MJIEnv env, int unsafeRef,
int objRef, long fieldOffset) {
return getObject__Ljava_lang_Object_2J__Ljava_lang_Object_2( env, unsafeRef, objRef, fieldOffset);
}
}

@MJI
public void putObject__Ljava_lang_Object_2JLjava_lang_Object_2__V (MJIEnv env, int unsafeRef,
public void putReference__Ljava_lang_Object_2JLjava_lang_Object_2__V (MJIEnv env, int unsafeRef,
int objRef, long fieldOffset, int valRef) {
ElementInfo ei = env.getModifiableElementInfo(objRef);

Expand All @@ -319,9 +312,9 @@ public void putObject__Ljava_lang_Object_2JLjava_lang_Object_2__V (MJIEnv env, i
}

@MJI
public void putObjectVolatile__Ljava_lang_Object_2JLjava_lang_Object_2__V (MJIEnv env, int unsafeRef,
public void putReferenceVolatile__Ljava_lang_Object_2JLjava_lang_Object_2__V (MJIEnv env, int unsafeRef,
int objRef, long fieldOffset, int valRef) {
putObject__Ljava_lang_Object_2JLjava_lang_Object_2__V( env, unsafeRef, objRef, fieldOffset, valRef);
putReference__Ljava_lang_Object_2JLjava_lang_Object_2__V( env, unsafeRef, objRef, fieldOffset, valRef);
}

@MJI
Expand All @@ -331,7 +324,7 @@ public void putOrderedObject__Ljava_lang_Object_2JLjava_lang_Object_2__V(
int objRef,
long fieldOffset,
int valRef) {
putObject__Ljava_lang_Object_2JLjava_lang_Object_2__V(env, unsafeRef, objRef, fieldOffset, valRef);
putReference__Ljava_lang_Object_2JLjava_lang_Object_2__V(env, unsafeRef, objRef, fieldOffset, valRef);
}

@MJI
Expand Down

0 comments on commit 505f0a2

Please sign in to comment.