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 |