--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java Fri May 24 20:51:28 2019 +0200
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java Mon May 27 18:33:13 2019 +0200
@@ -46,8 +46,10 @@
private final boolean hasDuration;
private final List<ValueDescriptor> valueDescriptors;
private final int startIndex;
+ private final RecordedEvent event;
private long thresholdTicks = -1;
private boolean enabled = true;
+ private boolean reuse;
EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) {
this.timeConverter = timeConverter;
@@ -56,6 +58,7 @@
this.hasDuration = type.getField(FIELD_DURATION) != null;
this.startIndex = hasDuration ? 2 : 1;
this.valueDescriptors = type.getFields();
+ this.event = new RecordedEvent(type, valueDescriptors, new Object[parsers.length], 0L, 0L, timeConverter);
}
public EventType getEventType() {
@@ -84,24 +87,44 @@
return null;
}
}
- Object[] values = new Object[parsers.length];
- for (int i = startIndex; i < parsers.length; i++) {
- values[i] = parsers[i].parse(input);
- }
- values[0] = startTicks;
- if (hasDuration) {
- values[1] = Long.valueOf(durationTicks);
- }
- long startTime = timeConverter.convertTimestamp(startTicks);
- if (hasDuration) {
- long endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
- return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter);
+ if (reuse) {
+ Object[] values = event.objects;
+ for (int i = startIndex; i < parsers.length; i++) {
+ values[i] = parsers[i].parse(input);
+ }
+ values[0] = startTicks;
+ if (hasDuration) {
+ values[1] = Long.valueOf(durationTicks);
+ }
+ long startTime = timeConverter.convertTimestamp(startTicks);
+ if (hasDuration) {
+ event.startTime = startTime;
+ event.endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
+ return event;
+ } else {
+ event.startTime = startTime;
+ event.endTime = startTime;
+ return event;
+ }
} else {
- return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter);
+ Object[] values = new Object[parsers.length];
+ for (int i = startIndex; i < parsers.length; i++) {
+ values[i] = parsers[i].parse(input);
+ }
+ values[0] = startTicks;
+ if (hasDuration) {
+ values[1] = Long.valueOf(durationTicks);
+ }
+ long startTime = timeConverter.convertTimestamp(startTicks);
+ if (hasDuration) {
+ long endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
+ return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter);
+ } else {
+ return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter);
+ }
}
}
- return null;
-
+ return event;
}
@Override
@@ -109,4 +132,8 @@
throw new InternalError("Should not call this method. More efficent to read event size and skip ahead");
}
+ public void setReuse(boolean reuse) {
+ this.reuse = reuse;
+ }
+
}