src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java
branchJEP-349-branch
changeset 57452 6fabe73e5d9a
parent 57385 7d9d4f629f6e
child 57460 bcbc53560c77
equal deleted inserted replaced
57449:099789ceff7d 57452:6fabe73e5d9a
    44     private final EventType eventType;
    44     private final EventType eventType;
    45     private final TimeConverter timeConverter;
    45     private final TimeConverter timeConverter;
    46     private final boolean hasDuration;
    46     private final boolean hasDuration;
    47     private final List<ValueDescriptor> valueDescriptors;
    47     private final List<ValueDescriptor> valueDescriptors;
    48     private final int startIndex;
    48     private final int startIndex;
    49     private long thresholdTicks = -1;
    49     private final int length;
       
    50     private final RecordedEvent unorderedEvent;
    50     private boolean enabled = true;
    51     private boolean enabled = true;
    51     private RecordedEvent[] eventCache;
    52     private RecordedEvent[] eventCache;
    52     private int index;
    53     private int index;
    53     private boolean ordered;
    54     private boolean ordered;
       
    55     private long firstNanos;
       
    56     private long thresholdNanos = -1;
    54 
    57 
    55     EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) {
    58     EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) {
    56         this.timeConverter = timeConverter;
    59         this.timeConverter = timeConverter;
    57         this.parsers = parsers;
    60         this.parsers = parsers;
    58         this.eventType = type;
    61         this.eventType = type;
    59         this.hasDuration = type.getField(FIELD_DURATION) != null;
    62         this.hasDuration = type.getField(FIELD_DURATION) != null;
    60         this.startIndex = hasDuration ? 2 : 1;
    63         this.startIndex = hasDuration ? 2 : 1;
       
    64         this.length = parsers.length - startIndex;
    61         this.valueDescriptors = type.getFields();
    65         this.valueDescriptors = type.getFields();
       
    66         this.unorderedEvent = new RecordedEvent(eventType, valueDescriptors, new Object[length], 0L, 0L, timeConverter);
    62     }
    67     }
    63 
    68 
    64     private RecordedEvent cachedEvent() {
    69     private RecordedEvent cachedEvent() {
    65         if (index == eventCache.length) {
    70         if (ordered) {
    66             RecordedEvent[] cache = eventCache;
    71             if (index == eventCache.length) {
    67             eventCache = new RecordedEvent[eventCache.length * 2];
    72                 RecordedEvent[] cache = eventCache;
    68             System.arraycopy(cache, 0, eventCache, 0, cache.length);
    73                 eventCache = new RecordedEvent[eventCache.length * 2];
       
    74                 System.arraycopy(cache, 0, eventCache, 0, cache.length);
       
    75             }
       
    76             RecordedEvent event = eventCache[index];
       
    77             if (event == null) {
       
    78                 event = new RecordedEvent(eventType, valueDescriptors, new Object[length], 0L, 0L, timeConverter);
       
    79                 eventCache[index] = event;
       
    80             }
       
    81             index++;
       
    82             return event;
       
    83         } else {
       
    84             return unorderedEvent;
    69         }
    85         }
    70         RecordedEvent event = eventCache[index];
       
    71         if (event == null) {
       
    72             event = new RecordedEvent(eventType, valueDescriptors, new Object[parsers.length], 0L, 0L, timeConverter);
       
    73             eventCache[index] = event;
       
    74         }
       
    75         if (ordered) {
       
    76             index++;
       
    77         }
       
    78         return event;
       
    79     }
    86     }
    80 
    87 
    81     public EventType getEventType() {
    88     public EventType getEventType() {
    82         return eventType;
    89         return eventType;
    83     }
    90     }
    84 
    91 
    85     public void setThreshold(long thresholdTicks) {
    92     public void setThresholdNanos(long thresholdNanos) {
    86         this.thresholdTicks = thresholdTicks;
    93         this.thresholdNanos = thresholdNanos;
    87     }
    94     }
    88 
    95 
    89     public void setEnabled(boolean enabled) {
    96     public void setEnabled(boolean enabled) {
    90         this.enabled = enabled;
    97         this.enabled = enabled;
    91     }
    98     }
    98         if (enabled) {
   105         if (enabled) {
    99             long startTicks = input.readLong();
   106             long startTicks = input.readLong();
   100             long durationTicks = 0;
   107             long durationTicks = 0;
   101             if (hasDuration) {
   108             if (hasDuration) {
   102                 durationTicks = input.readLong();
   109                 durationTicks = input.readLong();
   103                 if (durationTicks < thresholdTicks) {
   110                 if (thresholdNanos > 0L) {
       
   111                     if (timeConverter.convertTimespan(durationTicks) < thresholdNanos) {
       
   112                         return null;
       
   113                     }
       
   114                 }
       
   115             }
       
   116             long endTicks = startTicks + durationTicks;
       
   117             if (firstNanos > 0L) {
       
   118                 if (timeConverter.convertTimestamp(endTicks) < firstNanos) {
   104                     return null;
   119                     return null;
   105                 }
   120                 }
   106             }
   121             }
       
   122 
   107             if (eventCache != null) {
   123             if (eventCache != null) {
   108                 RecordedEvent event = cachedEvent();
   124                 RecordedEvent event = cachedEvent();
       
   125                 event.startTimeTicks = startTicks;
       
   126                 event.endTimeTicks = endTicks;
   109                 Object[] values = event.objects;
   127                 Object[] values = event.objects;
   110                 for (int i = startIndex; i < parsers.length; i++) {
   128                 for (int i = 0; i < length; i++) {
   111                     values[i] = parsers[i].parse(input);
   129                     values[i] = parsers[startIndex + i].parse(input);
   112                 }
   130                 }
   113                 values[0] = startTicks;
   131                 return event;
   114                 if (hasDuration) {
   132             } else {
   115                     values[1] = Long.valueOf(durationTicks);
   133                 Object[] values = new Object[length];
       
   134                 for (int i = 0; i < length; i++) {
       
   135                     values[i] = parsers[startIndex + i].parse(input);
   116                 }
   136                 }
   117                 long startTime = timeConverter.convertTimestamp(startTicks);
   137                 return new RecordedEvent(eventType, valueDescriptors, values, startTicks, endTicks, timeConverter);
   118                 if (hasDuration) {
       
   119                     event.startTime = startTime;
       
   120                     event.endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
       
   121                     return event;
       
   122                 } else {
       
   123                     event.startTime = startTime;
       
   124                     event.endTime = startTime;
       
   125                     return event;
       
   126                 }
       
   127             } else {
       
   128                 Object[] values = new Object[parsers.length];
       
   129                 for (int i = startIndex; i < parsers.length; i++) {
       
   130                     values[i] = parsers[i].parse(input);
       
   131                 }
       
   132                 values[0] = startTicks;
       
   133                 if (hasDuration) {
       
   134                     values[1] = Long.valueOf(durationTicks);
       
   135                 }
       
   136                 long startTime = timeConverter.convertTimestamp(startTicks);
       
   137                 if (hasDuration) {
       
   138                     long endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
       
   139                     return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter);
       
   140                 } else {
       
   141                     return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter);
       
   142                 }
       
   143             }
   138             }
   144         }
   139         }
   145         return null;
   140         return null;
   146     }
   141     }
   147 
   142 
   168         } else {
   163         } else {
   169             eventCache = null;
   164             eventCache = null;
   170         }
   165         }
   171     }
   166     }
   172 
   167 
       
   168     public void setFirstNanos(long firstNanos) {
       
   169         this.firstNanos = firstNanos;
       
   170     }
       
   171 
   173     public void setOrdered(boolean ordered) {
   172     public void setOrdered(boolean ordered) {
   174         if (this.ordered == ordered) {
   173         if (this.ordered == ordered) {
   175             return;
   174             return;
   176         }
   175         }
   177        this.ordered = ordered;
   176         this.ordered = ordered;
   178        this.index = 0;
   177         this.index = 0;
   179     }
   178     }
   180 }
   179 }