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;
25 * a full peer for the AtomicIntegerFieldUpdater
27 public class JPF_java_util_concurrent_atomic_AtomicIntegerFieldUpdater extends AtomicFieldUpdater {
30 public void $init__Ljava_lang_Class_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int tClsObjRef, int fNameRef) {
32 // direct Object subclass, so we don't have to call a super ctor
34 ClassInfo ci = env.getReferredClassInfo( tClsObjRef);
35 String fname = env.getStringObject(fNameRef);
37 FieldInfo fi = ci.getInstanceField(fname);
38 ClassInfo fci = fi.getTypeClassInfo();
40 if (!fci.isPrimitive() || !fci.getName().equals("int")) {
41 // that's also just an approximation, but we need to check
42 env.throwException("java.lang.RuntimeException", "wrong field type");
45 int fidx = fi.getFieldIndex();
46 env.setIntField(objRef, "fieldId", fidx);
50 public boolean compareAndSet__Ljava_lang_Object_2II__Z (MJIEnv env, int objRef, int tRef, int fExpect, int fUpdate) {
51 if (tRef == MJIEnv.NULL){
52 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
56 ThreadInfo ti = env.getThreadInfo();
57 ElementInfo ei = ti.getModifiableElementInfo(tRef);
58 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
60 if (reschedulesAccess(ti, ei, fi)){
61 env.repeatInvocation();
65 int v = ei.getIntField(fi);
67 ei = ei.getModifiableInstance();
68 ei.setIntField(fi, fUpdate);
76 public boolean weakCompareAndSet__Ljava_lang_Object_2II__Z (MJIEnv env, int objRef, int tRef, int fExpect, int fUpdate) {
77 return (compareAndSet__Ljava_lang_Object_2II__Z(env, objRef, tRef, fExpect, fUpdate));
81 public void set__Ljava_lang_Object_2I__V (MJIEnv env, int objRef, int tRef, int fNewValue) {
82 if (tRef == MJIEnv.NULL){
83 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
87 ThreadInfo ti = env.getThreadInfo();
88 ElementInfo ei = ti.getModifiableElementInfo(tRef);
89 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
91 if (reschedulesAccess(ti, ei, fi)){
92 env.repeatInvocation();
96 ei.setIntField(fi, fNewValue);
100 public void lazySet__Ljava_lang_Object_2I__V (MJIEnv env, int objRef, int tRef, int fNewValue) {
101 set__Ljava_lang_Object_2I__V(env, objRef, tRef, fNewValue);
105 public int get__Ljava_lang_Object_2__I(MJIEnv env, int objRef, int tRef) {
106 if (tRef == MJIEnv.NULL){
107 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
111 ThreadInfo ti = env.getThreadInfo();
112 ElementInfo ei = ti.getElementInfo(tRef);
113 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
115 if (reschedulesAccess(ti, ei, fi)){
116 env.repeatInvocation();
121 return ei.getIntField(fi);
125 public int getAndSet__Ljava_lang_Object_2I__I (MJIEnv env, int objRef, int tRef, int fNewValue) {
126 if (tRef == MJIEnv.NULL){
127 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
131 ThreadInfo ti = env.getThreadInfo();
132 ElementInfo ei = ti.getModifiableElementInfo(tRef);
133 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
135 if (reschedulesAccess(ti, ei, fi)){
136 env.repeatInvocation();
140 int result = ei.getIntField(fi);
141 ei.setIntField(fi, fNewValue);
147 public int getAndAdd__Ljava_lang_Object_2I__I (MJIEnv env, int objRef, int tRef, int fDelta) {
148 if (tRef == MJIEnv.NULL){
149 env.throwException("java.lang.NullPointerException", "AtomicFieldUpdater called on null object");
153 ThreadInfo ti = env.getThreadInfo();
154 ElementInfo ei = ti.getModifiableElementInfo(tRef);
155 FieldInfo fi = getFieldInfo( ti.getElementInfo(objRef), ei);
157 if (reschedulesAccess(ti, ei, fi)){
158 env.repeatInvocation();
162 int result = ei.getIntField(fi);
163 ei.setIntField(fi, result + fDelta);