2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
6 * The Java Pathfinder core (jpf-core) platform is licensed under the
7 * Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0.
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 package gov.nasa.jpf.vm;
21 import gov.nasa.jpf.annotation.MJI;
22 import gov.nasa.jpf.vm.ClassInfo;
23 import gov.nasa.jpf.vm.ElementInfo;
24 import gov.nasa.jpf.vm.FieldInfo;
25 import gov.nasa.jpf.vm.MJIEnv;
29 * a full peer for the AtomicLongFieldUpdater
31 public class JPF_java_util_concurrent_atomic_AtomicLongFieldUpdater extends AtomicFieldUpdater {
34 public void $init__Ljava_lang_Class_2Ljava_lang_String_2__V (MJIEnv env, int objRef,
35 int tClsObjRef, int fNameRef) {
37 // direct Object subclass, so we don't have to call a super ctor
39 ClassInfo ci = env.getReferredClassInfo(tClsObjRef);
40 String fname = env.getStringObject(fNameRef);
41 FieldInfo fi = ci.getInstanceField(fname);
43 ClassInfo fci = fi.getTypeClassInfo();
45 if (!fci.isPrimitive() || !fci.getName().equals("long")) {
46 // that's also just an approximation, but we need to check
47 env.throwException("java.lang.RuntimeException", "wrong field type");
50 int fidx = fi.getFieldIndex();
51 env.setIntField(objRef, "fieldId", fidx);
55 public boolean compareAndSet__Ljava_lang_Object_2JJ__Z (MJIEnv env, int objRef, int tRef, long fExpect, long fUpdate){
56 if (tRef == MJIEnv.NULL){
57 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
61 ThreadInfo ti = env.getThreadInfo();
62 ElementInfo ei = ti.getModifiableElementInfo(tRef);
63 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
65 if (reschedulesAccess(ti, ei, fi)){
66 env.repeatInvocation();
70 long v = ei.getLongField(fi);
72 ei.setLongField(fi, fUpdate);
80 public boolean weakCompareAndSet__Ljava_lang_Object_2JJ__Z (MJIEnv env, int objRef, int tRef, long fExpect, long fUpdate){
81 return(compareAndSet__Ljava_lang_Object_2JJ__Z(env, objRef, tRef, fExpect, fUpdate));
85 public void set__Ljava_lang_Object_2J__V (MJIEnv env, int objRef, int tRef, long fNewValue){
86 if (tRef == MJIEnv.NULL){
87 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
91 ThreadInfo ti = env.getThreadInfo();
92 ElementInfo ei = ti.getModifiableElementInfo(tRef);
93 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
95 if (reschedulesAccess(ti, ei, fi)){
96 env.repeatInvocation();
100 ei.setLongField(fi, fNewValue);
104 public void lazySet__Ljava_lang_Object_2J__V (MJIEnv env, int objRef, int tRef, long fNewValue){
105 set__Ljava_lang_Object_2J__V(env, objRef, tRef, fNewValue);
109 public long get__Ljava_lang_Object_2__J (MJIEnv env, int objRef, int tRef){
110 if (tRef == MJIEnv.NULL){
111 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
115 ThreadInfo ti = env.getThreadInfo();
116 ElementInfo ei = ti.getElementInfo(tRef);
117 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
119 if (reschedulesAccess(ti, ei, fi)){
120 env.repeatInvocation();
124 return ei.getLongField(fi);
128 public long getAndSet__Ljava_lang_Object_2J__J (MJIEnv env, int objRef, int tRef, long fNewValue){
129 if (tRef == MJIEnv.NULL){
130 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
134 ThreadInfo ti = env.getThreadInfo();
135 ElementInfo ei = ti.getModifiableElementInfo(tRef);
136 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
138 if (reschedulesAccess(ti, ei, fi)){
139 env.repeatInvocation();
143 long result = ei.getLongField(fi);
144 ei.setLongField(fi, fNewValue);
150 public long getAndAdd__Ljava_lang_Object_2J__J (MJIEnv env, int objRef, int tRef, long fDelta){
151 if (tRef == MJIEnv.NULL){
152 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
156 ThreadInfo ti = env.getThreadInfo();
157 ElementInfo ei = ti.getModifiableElementInfo(tRef);
158 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
160 if (reschedulesAccess(ti, ei, fi)){
161 env.repeatInvocation();
165 long result = ei.getLongField(fi);
166 ei.setLongField(fi, result + fDelta);