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.Config;
24 * a generic scheduler with configured SyncPolicy and SharednesPolicy objects it delegates to
26 public class DelegatingScheduler implements Scheduler {
28 protected SyncPolicy syncPolicy;
29 protected SharednessPolicy sharednessPolicy;
32 public DelegatingScheduler (Config config){
33 syncPolicy = config.getEssentialInstance("vm.scheduler.sync.class", SyncPolicy.class);
34 sharednessPolicy = config.getEssentialInstance("vm.scheduler.sharedness.class", SharednessPolicy.class);
37 //--- Scheduler interface
40 public void initialize (VM vm, ApplicationContext appCtx) {
41 syncPolicy.initializeSyncPolicy(vm, appCtx);
42 sharednessPolicy.initializeSharednessPolicy(vm, appCtx);
46 //--- SyncPolicy interface
49 public void initializeSyncPolicy (VM vm, ApplicationContext appCtx) {
50 syncPolicy.initializeSyncPolicy(vm, appCtx);
54 public void initializeThreadSync (ThreadInfo tiCurrent, ThreadInfo tiNew) {
55 syncPolicy.initializeThreadSync(tiCurrent, tiNew);
59 public void setRootCG (){
60 syncPolicy.setRootCG();
64 public boolean setsBlockedThreadCG (ThreadInfo ti, ElementInfo ei) {
65 return syncPolicy.setsBlockedThreadCG(ti, ei);
69 public boolean setsLockAcquisitionCG (ThreadInfo ti, ElementInfo ei) {
70 return syncPolicy.setsLockAcquisitionCG(ti, ei);
74 public boolean setsLockReleaseCG (ThreadInfo ti, ElementInfo ei, boolean didUnblock) {
75 return syncPolicy.setsLockReleaseCG(ti, ei, didUnblock);
79 public boolean setsTerminationCG (ThreadInfo ti) {
80 return syncPolicy.setsTerminationCG(ti);
84 public boolean setsWaitCG (ThreadInfo ti, long timeout) {
85 return syncPolicy.setsWaitCG(ti, timeout);
89 public boolean setsNotifyCG (ThreadInfo ti, boolean didNotify) {
90 return syncPolicy.setsNotifyCG(ti, didNotify);
94 public boolean setsNotifyAllCG (ThreadInfo ti, boolean didNotify) {
95 return syncPolicy.setsNotifyAllCG(ti, didNotify);
99 public boolean setsStartCG (ThreadInfo tiCurrent, ThreadInfo tiStarted) {
100 return syncPolicy.setsStartCG(tiCurrent, tiStarted);
104 public boolean setsYieldCG (ThreadInfo ti) {
105 return syncPolicy.setsYieldCG(ti);
109 public boolean setsPriorityCG (ThreadInfo ti) {
110 return syncPolicy.setsPriorityCG(ti);
115 public boolean setsSleepCG (ThreadInfo ti, long millis, int nanos) {
116 return syncPolicy.setsSleepCG(ti, millis, nanos);
120 public boolean setsSuspendCG (ThreadInfo tiCurrent, ThreadInfo tiSuspended) {
121 return syncPolicy.setsSuspendCG(tiCurrent, tiSuspended);
125 public boolean setsResumeCG (ThreadInfo tiCurrent, ThreadInfo tiResumed) {
126 return syncPolicy.setsResumeCG(tiCurrent, tiResumed);
130 public boolean setsJoinCG (ThreadInfo tiCurrent, ThreadInfo tiJoin, long timeout) {
131 return syncPolicy.setsJoinCG(tiCurrent, tiJoin, timeout);
135 public boolean setsStopCG (ThreadInfo tiCurrent, ThreadInfo tiStopped) {
136 return syncPolicy.setsStopCG(tiCurrent, tiStopped);
140 public boolean setsInterruptCG (ThreadInfo tiCurrent, ThreadInfo tiInterrupted) {
141 return syncPolicy.setsInterruptCG(tiCurrent, tiInterrupted);
145 public boolean setsParkCG (ThreadInfo ti, boolean isAbsTime, long timeout) {
146 return syncPolicy.setsParkCG(ti, isAbsTime, timeout);
150 public boolean setsUnparkCG (ThreadInfo tiCurrent, ThreadInfo tiUnparked) {
151 return syncPolicy.setsUnparkCG(tiCurrent, tiUnparked);
155 public boolean setsBeginAtomicCG (ThreadInfo ti) {
156 return syncPolicy.setsBeginAtomicCG(ti);
160 public boolean setsEndAtomicCG (ThreadInfo ti) {
161 return syncPolicy.setsEndAtomicCG(ti);
165 public boolean setsRescheduleCG (ThreadInfo ti, String reason) {
166 return syncPolicy.setsRescheduleCG(ti, reason);
170 public boolean setsPostFinalizeCG (ThreadInfo tiFinalizer) {
171 return syncPolicy.setsPostFinalizeCG(tiFinalizer);
175 //--- SharednessPolicy interface
178 public void initializeSharednessPolicy (VM vm, ApplicationContext appCtx) {
179 sharednessPolicy.initializeSharednessPolicy( vm, appCtx);
183 public void initializeObjectSharedness (ThreadInfo allocThread, DynamicElementInfo ei) {
184 sharednessPolicy.initializeObjectSharedness(allocThread, ei);
188 public void initializeClassSharedness (ThreadInfo allocThread, StaticElementInfo ei) {
189 sharednessPolicy.initializeClassSharedness(allocThread, ei);
193 public boolean canHaveSharedObjectCG (ThreadInfo ti, Instruction insn, ElementInfo eiFieldOwner, FieldInfo fi) {
194 return sharednessPolicy.canHaveSharedObjectCG(ti, insn, eiFieldOwner, fi);
198 public ElementInfo updateObjectSharedness (ThreadInfo ti, ElementInfo ei, FieldInfo fi) {
199 return sharednessPolicy.updateObjectSharedness(ti, ei, fi);
203 public boolean setsSharedObjectCG (ThreadInfo ti, Instruction insn, ElementInfo eiFieldOwner, FieldInfo fi) {
204 return sharednessPolicy.setsSharedObjectCG(ti, insn, eiFieldOwner, fi);
208 public boolean canHaveSharedClassCG (ThreadInfo ti, Instruction insn, ElementInfo eiFieldOwner, FieldInfo fi) {
209 return sharednessPolicy.canHaveSharedClassCG(ti,insn,eiFieldOwner, fi);
213 public ElementInfo updateClassSharedness (ThreadInfo ti, ElementInfo ei, FieldInfo fi) {
214 return sharednessPolicy.updateClassSharedness(ti, ei, fi);
218 public boolean setsSharedClassCG (ThreadInfo ti, Instruction insn, ElementInfo eiFieldOwner, FieldInfo fi) {
219 return sharednessPolicy.setsSharedClassCG(ti, insn, eiFieldOwner, fi);
223 public boolean canHaveSharedArrayCG (ThreadInfo ti, Instruction insn, ElementInfo eiArray, int idx) {
224 return sharednessPolicy.canHaveSharedArrayCG(ti, insn, eiArray, idx);
228 public ElementInfo updateArraySharedness (ThreadInfo ti, ElementInfo eiArray, int idx) {
229 return sharednessPolicy.updateArraySharedness(ti,eiArray,idx);
233 public boolean setsSharedArrayCG (ThreadInfo ti, Instruction insn, ElementInfo eiArray, int idx) {
234 return sharednessPolicy.setsSharedArrayCG(ti, insn, eiArray, idx);
238 public boolean setsSharedObjectExposureCG (ThreadInfo ti, Instruction insn, ElementInfo eiFieldOwner, FieldInfo fi, ElementInfo eiExposed) {
239 return sharednessPolicy.setsSharedObjectExposureCG(ti,insn,eiFieldOwner,fi,eiExposed);
243 public boolean setsSharedClassExposureCG (ThreadInfo ti, Instruction insn, ElementInfo eiFieldOwner, FieldInfo fi, ElementInfo eiExposed) {
244 return sharednessPolicy.setsSharedClassExposureCG(ti, insn, eiFieldOwner, fi, eiExposed);
248 public void cleanupThreadTermination (ThreadInfo ti) {
249 sharednessPolicy.cleanupThreadTermination(ti);