src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java
branchJEP-349-branch
changeset 57380 6a7e7743b82f
parent 57376 8e8a06a3059c
child 57385 7d9d4f629f6e
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java	Mon May 27 23:05:54 2019 +0200
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java	Thu May 30 23:04:50 2019 +0200
@@ -46,10 +46,11 @@
     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;
+    private RecordedEvent[] eventCache;
+    private int index;
+    private boolean ordered;
 
     EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) {
         this.timeConverter = timeConverter;
@@ -58,7 +59,23 @@
         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);
+    }
+
+    private RecordedEvent cachedEvent() {
+        if (index == eventCache.length) {
+            RecordedEvent[] cache = eventCache;
+            eventCache = new RecordedEvent[eventCache.length * 2];
+            System.arraycopy(cache, 0, eventCache, 0, cache.length);
+        }
+        RecordedEvent event = eventCache[index];
+        if (event == null) {
+            event = new RecordedEvent(eventType, valueDescriptors, new Object[parsers.length], 0L, 0L, timeConverter);
+            eventCache[index] = event;
+        }
+        if (ordered) {
+            index++;
+        }
+        return event;
     }
 
     public EventType getEventType() {
@@ -87,7 +104,8 @@
                     return null;
                 }
             }
-            if (reuse) {
+            if (eventCache != null) {
+                RecordedEvent event = cachedEvent();
                 Object[] values = event.objects;
                 for (int i = startIndex; i < parsers.length; i++) {
                     values[i] = parsers[i].parse(input);
@@ -124,7 +142,7 @@
                 }
             }
         }
-        return event;
+        return null;
     }
 
     @Override
@@ -132,8 +150,27 @@
         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;
+    public void resetCache() {
+        index = 0;
+    }
+
+    public boolean hasReuse() {
+        return eventCache != null;
     }
 
+    public void setReuse(boolean reuse) {
+        if (reuse == hasReuse()) {
+            return;
+        }
+        if (reuse) {
+            eventCache = new RecordedEvent[2];
+            index = 0;
+        } else {
+            eventCache = null;
+        }
+    }
+
+    public void setOrdered(boolean ordered) {
+       this.ordered = ordered;
+    }
 }