src/jdk.jfr/share/classes/jdk/jfr/consumer/EventParser.java
branchJEP-349-branch
changeset 57376 8e8a06a3059c
parent 57360 5d043a159d5c
child 57380 6a7e7743b82f
equal deleted inserted replaced
57375:3efa9b992c4d 57376:8e8a06a3059c
    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 final RecordedEvent event;
    49     private long thresholdTicks = -1;
    50     private long thresholdTicks = -1;
    50     private boolean enabled = true;
    51     private boolean enabled = true;
       
    52     private boolean reuse;
    51 
    53 
    52     EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) {
    54     EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) {
    53         this.timeConverter = timeConverter;
    55         this.timeConverter = timeConverter;
    54         this.parsers = parsers;
    56         this.parsers = parsers;
    55         this.eventType = type;
    57         this.eventType = type;
    56         this.hasDuration = type.getField(FIELD_DURATION) != null;
    58         this.hasDuration = type.getField(FIELD_DURATION) != null;
    57         this.startIndex = hasDuration ? 2 : 1;
    59         this.startIndex = hasDuration ? 2 : 1;
    58         this.valueDescriptors = type.getFields();
    60         this.valueDescriptors = type.getFields();
       
    61         this.event = new RecordedEvent(type, valueDescriptors, new Object[parsers.length], 0L, 0L, timeConverter);
    59     }
    62     }
    60 
    63 
    61     public EventType getEventType() {
    64     public EventType getEventType() {
    62         return eventType;
    65         return eventType;
    63     }
    66     }
    82                 durationTicks = input.readLong();
    85                 durationTicks = input.readLong();
    83                 if (durationTicks < thresholdTicks) {
    86                 if (durationTicks < thresholdTicks) {
    84                     return null;
    87                     return null;
    85                 }
    88                 }
    86             }
    89             }
    87             Object[] values = new Object[parsers.length];
    90             if (reuse) {
    88             for (int i = startIndex; i < parsers.length; i++) {
    91                 Object[] values = event.objects;
    89                 values[i] = parsers[i].parse(input);
    92                 for (int i = startIndex; i < parsers.length; i++) {
    90             }
    93                     values[i] = parsers[i].parse(input);
    91             values[0] = startTicks;
    94                 }
    92             if (hasDuration) {
    95                 values[0] = startTicks;
    93                 values[1] = Long.valueOf(durationTicks);
    96                 if (hasDuration) {
    94             }
    97                     values[1] = Long.valueOf(durationTicks);
    95             long startTime = timeConverter.convertTimestamp(startTicks);
    98                 }
    96             if (hasDuration) {
    99                 long startTime = timeConverter.convertTimestamp(startTicks);
    97                 long endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
   100                 if (hasDuration) {
    98                 return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter);
   101                     event.startTime = startTime;
       
   102                     event.endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
       
   103                     return event;
       
   104                 } else {
       
   105                     event.startTime = startTime;
       
   106                     event.endTime = startTime;
       
   107                     return event;
       
   108                 }
    99             } else {
   109             } else {
   100                 return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter);
   110                 Object[] values = new Object[parsers.length];
       
   111                 for (int i = startIndex; i < parsers.length; i++) {
       
   112                     values[i] = parsers[i].parse(input);
       
   113                 }
       
   114                 values[0] = startTicks;
       
   115                 if (hasDuration) {
       
   116                     values[1] = Long.valueOf(durationTicks);
       
   117                 }
       
   118                 long startTime = timeConverter.convertTimestamp(startTicks);
       
   119                 if (hasDuration) {
       
   120                     long endTime = timeConverter.convertTimestamp(startTicks + durationTicks);
       
   121                     return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter);
       
   122                 } else {
       
   123                     return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter);
       
   124                 }
   101             }
   125             }
   102         }
   126         }
   103         return null;
   127         return event;
   104 
       
   105     }
   128     }
   106 
   129 
   107     @Override
   130     @Override
   108     public void skip(RecordingInput input) throws IOException {
   131     public void skip(RecordingInput input) throws IOException {
   109         throw new InternalError("Should not call this method. More efficent to read event size and skip ahead");
   132         throw new InternalError("Should not call this method. More efficent to read event size and skip ahead");
   110     }
   133     }
   111 
   134 
       
   135     public void setReuse(boolean reuse) {
       
   136         this.reuse = reuse;
       
   137     }
       
   138 
   112 }
   139 }