Mercurial > hg > Members > kono > jpf-core
comparison src/main/gov/nasa/jpf/report/Statistics.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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:61d41facf527 |
---|---|
1 /* | |
2 * Copyright (C) 2014, United States Government, as represented by the | |
3 * Administrator of the National Aeronautics and Space Administration. | |
4 * All rights reserved. | |
5 * | |
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 | |
9 * | |
10 * http://www.apache.org/licenses/LICENSE-2.0. | |
11 * | |
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. | |
17 */ | |
18 | |
19 package gov.nasa.jpf.report; | |
20 | |
21 import gov.nasa.jpf.ListenerAdapter; | |
22 import gov.nasa.jpf.jvm.bytecode.EXECUTENATIVE; | |
23 import gov.nasa.jpf.jvm.bytecode.JVMFieldInstruction; | |
24 import gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction; | |
25 import gov.nasa.jpf.jvm.bytecode.LockInstruction; | |
26 import gov.nasa.jpf.search.Search; | |
27 import gov.nasa.jpf.vm.ChoiceGenerator; | |
28 import gov.nasa.jpf.vm.ClassInfo; | |
29 import gov.nasa.jpf.vm.ElementInfo; | |
30 import gov.nasa.jpf.vm.Instruction; | |
31 import gov.nasa.jpf.vm.ThreadInfo; | |
32 import gov.nasa.jpf.vm.VM; | |
33 import gov.nasa.jpf.vm.MethodInfo; | |
34 import gov.nasa.jpf.vm.ThreadChoiceGenerator; | |
35 | |
36 /** | |
37 * simple structure to hold statistics info created by Reporters/Publishers | |
38 * this is kind of a second tier SearchListener, which does not | |
39 * explicitly have to be registered | |
40 * | |
41 * <2do> this should get generic and accessible enough to replace all the | |
42 * other statistics collectors, otherwise there is too much redundancy. | |
43 * If users have special requirements, they should subclass Statistics | |
44 * and set jpf.report.statistics.class accordingly | |
45 * | |
46 * Note that Statistics might be accessed by a background thread | |
47 * reporting JPF progress, hence we have to synchronize | |
48 */ | |
49 public class Statistics extends ListenerAdapter implements Cloneable { | |
50 | |
51 // we make these public since we don't want to add a gazillion of | |
52 // getters for these purely informal numbers | |
53 | |
54 public long maxUsed = 0; | |
55 public long newStates = 0; | |
56 public long backtracked = 0; | |
57 public long restored = 0; | |
58 public int processed = 0; | |
59 public int constraints = 0; | |
60 public long visitedStates = 0; | |
61 public long endStates = 0; | |
62 public int maxDepth = 0; | |
63 | |
64 public int gcCycles = 0; | |
65 public long insns = 0; | |
66 public int threadCGs = 0; | |
67 public int sharedAccessCGs = 0; | |
68 public int monitorCGs = 0; | |
69 public int signalCGs = 0; | |
70 public int threadApiCGs = 0; | |
71 public int breakTransitionCGs = 0; | |
72 public int dataCGs = 0; | |
73 public long nNewObjects = 0; | |
74 public long nReleasedObjects = 0; | |
75 public int maxLiveObjects = 0; | |
76 | |
77 @Override | |
78 public Statistics clone() { | |
79 try { | |
80 return (Statistics)super.clone(); | |
81 } catch (CloneNotSupportedException e) { | |
82 return null; // can't happen | |
83 } | |
84 } | |
85 | |
86 @Override | |
87 public void gcBegin (VM vm) { | |
88 int heapSize = vm.getHeap().size(); | |
89 if (heapSize > maxLiveObjects){ | |
90 maxLiveObjects = heapSize; | |
91 } | |
92 | |
93 gcCycles++; | |
94 } | |
95 | |
96 @Override | |
97 public void instructionExecuted (VM vm, ThreadInfo ti, Instruction nextInsn, Instruction executedInsn){ | |
98 insns++; | |
99 } | |
100 | |
101 @Override | |
102 public void choiceGeneratorSet (VM vm, ChoiceGenerator<?> newCG){ | |
103 ChoiceGenerator<?> cg = VM.getVM().getChoiceGenerator(); | |
104 if (cg instanceof ThreadChoiceGenerator){ | |
105 threadCGs++; | |
106 | |
107 Instruction insn = cg.getInsn(); | |
108 if (insn instanceof JVMFieldInstruction) { | |
109 sharedAccessCGs++; | |
110 } else if (insn instanceof LockInstruction || insn instanceof JVMInvokeInstruction) { | |
111 monitorCGs++; | |
112 } else if (insn instanceof EXECUTENATIVE) { | |
113 MethodInfo mi = insn.getMethodInfo(); | |
114 if (mi != null) { | |
115 ClassInfo ci = mi.getClassInfo(); | |
116 if (ci != null) { | |
117 if (ci.isObjectClassInfo()) { | |
118 // its got to be either a wait or a notify since we know the java.lang.Object methods | |
119 signalCGs++; | |
120 } else if (ci.isThreadClassInfo()) { | |
121 threadApiCGs++; | |
122 } | |
123 } else { | |
124 // Hmm - a CG from a synthetic method? | |
125 } | |
126 } else { | |
127 // even more Hmmm - a GC from a synthesized instruction | |
128 } | |
129 } else { | |
130 breakTransitionCGs++; // e.g. max_transition_length or idleLoop breakers | |
131 } | |
132 } else { | |
133 dataCGs++; | |
134 } | |
135 } | |
136 | |
137 @Override | |
138 public void objectCreated (VM vm, ThreadInfo ti, ElementInfo ei){ | |
139 nNewObjects++; | |
140 } | |
141 | |
142 @Override | |
143 public void objectReleased (VM vm, ThreadInfo ti, ElementInfo ei){ | |
144 nReleasedObjects++; | |
145 } | |
146 | |
147 @Override | |
148 public void stateAdvanced (Search search){ | |
149 long m = Runtime.getRuntime().totalMemory(); | |
150 if (m > maxUsed) { | |
151 maxUsed = m; | |
152 } | |
153 | |
154 if (search.isNewState()){ | |
155 newStates++; | |
156 int depth = search.getDepth(); | |
157 if (depth > maxDepth){ | |
158 maxDepth = depth; | |
159 } | |
160 } else { | |
161 visitedStates++; | |
162 } | |
163 if (search.isEndState()){ | |
164 endStates++; | |
165 } | |
166 } | |
167 | |
168 @Override | |
169 public void stateBacktracked (Search search){ | |
170 backtracked++; | |
171 } | |
172 | |
173 @Override | |
174 public void stateProcessed (Search search){ | |
175 processed++; | |
176 } | |
177 | |
178 @Override | |
179 public void stateRestored (Search search){ | |
180 restored++; | |
181 } | |
182 | |
183 @Override | |
184 public void searchConstraintHit (Search search){ | |
185 constraints++; | |
186 } | |
187 | |
188 } |