119 } |
119 } |
120 |
120 |
121 |
121 |
122 /** |
122 /** |
123 * Reads an event and returns null when segment or chunk ends. |
123 * Reads an event and returns null when segment or chunk ends. |
|
124 * |
|
125 * @param awaitNewEvents wait for new data. |
124 */ |
126 */ |
125 public RecordedEvent readStreamingEvent(boolean awaitNewEvents) throws IOException { |
127 public RecordedEvent readStreamingEvent(boolean awaitNewEvents) throws IOException { |
126 long absoluteChunkEnd = chunkHeader.getEnd(); |
128 long absoluteChunkEnd = chunkHeader.getEnd(); |
127 while (true) { |
129 while (true) { |
128 RecordedEvent event = readEvent(); |
130 RecordedEvent event = readEvent(); |
190 } |
192 } |
191 return null; |
193 return null; |
192 } |
194 } |
193 |
195 |
194 private boolean awaitUpdatedHeader(long absoluteChunkEnd) throws IOException { |
196 private boolean awaitUpdatedHeader(long absoluteChunkEnd) throws IOException { |
195 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Waiting for more data (streaming). Read so far: " + chunkHeader.getChunkSize() + " bytes"); |
197 if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO)) { |
|
198 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Waiting for more data (streaming). Read so far: " + chunkHeader.getChunkSize() + " bytes"); |
|
199 } |
196 while (true) { |
200 while (true) { |
197 chunkHeader.refresh(); |
201 chunkHeader.refresh(); |
198 if (absoluteChunkEnd != chunkHeader.getEnd()) { |
202 if (absoluteChunkEnd != chunkHeader.getEnd()) { |
199 return false; |
203 return false; |
200 } |
204 } |
207 |
211 |
208 private void fillConstantPools(long abortCP) throws IOException { |
212 private void fillConstantPools(long abortCP) throws IOException { |
209 long thisCP = chunkHeader.getConstantPoolPosition() + chunkHeader.getAbsoluteChunkStart(); |
213 long thisCP = chunkHeader.getConstantPoolPosition() + chunkHeader.getAbsoluteChunkStart(); |
210 long lastCP = -1; |
214 long lastCP = -1; |
211 long delta = -1; |
215 long delta = -1; |
212 boolean log = Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE); |
216 boolean logTrace = Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE); |
213 while (thisCP != abortCP && delta != 0) { |
217 while (thisCP != abortCP && delta != 0) { |
214 input.position(thisCP); |
218 input.position(thisCP); |
215 lastCP = thisCP; |
219 lastCP = thisCP; |
216 int size = input.readInt(); // size |
220 int size = input.readInt(); // size |
217 long typeId = input.readLong(); |
221 long typeId = input.readLong(); |
224 thisCP += delta; |
228 thisCP += delta; |
225 boolean flush = input.readBoolean(); |
229 boolean flush = input.readBoolean(); |
226 int poolCount = input.readInt(); |
230 int poolCount = input.readInt(); |
227 final long logLastCP = lastCP; |
231 final long logLastCP = lastCP; |
228 final long logDelta = delta; |
232 final long logDelta = delta; |
229 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, () -> { |
233 if (logTrace) { |
230 return "New constant pool: startPosition=" + logLastCP + ", size=" + size + ", deltaToNext=" + logDelta + ", flush=" + flush + ", poolCount=" + poolCount; |
234 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, () -> { |
231 }); |
235 return "New constant pool: startPosition=" + logLastCP + ", size=" + size + ", deltaToNext=" + logDelta + ", flush=" + flush + ", poolCount=" + poolCount; |
|
236 }); |
|
237 } |
232 for (int i = 0; i < poolCount; i++) { |
238 for (int i = 0; i < poolCount; i++) { |
233 long id = input.readLong(); // type id |
239 long id = input.readLong(); // type id |
234 ConstantLookup lookup = constantLookups.get(id); |
240 ConstantLookup lookup = constantLookups.get(id); |
235 Type type = typeMap.get(id); |
241 Type type = typeMap.get(id); |
236 if (lookup == null) { |
242 if (lookup == null) { |
249 try { |
255 try { |
250 int count = input.readInt(); |
256 int count = input.readInt(); |
251 if (count == 0) { |
257 if (count == 0) { |
252 throw new InternalError("Pool " + type.getName() + " must contain at least one element "); |
258 throw new InternalError("Pool " + type.getName() + " must contain at least one element "); |
253 } |
259 } |
254 if (log) { |
260 if (logTrace) { |
255 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, "Constant Pool " + i + ": " + type.getName()); |
261 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, "Constant Pool " + i + ": " + type.getName()); |
256 } |
262 } |
257 for (int j = 0; j < count; j++) { |
263 for (int j = 0; j < count; j++) { |
258 long key = input.readLong(); |
264 long key = input.readLong(); |
259 Object resolved = lookup.getPreviousResolved(key); |
265 Object resolved = lookup.getPreviousResolved(key); |