diff -r 2c3cc4b01880 -r c16ac7a2eba4 src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java Wed Oct 30 16:14:56 2019 +0100 +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java Wed Oct 30 19:43:52 2019 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ import jdk.jfr.EventType; import jdk.jfr.ValueDescriptor; import jdk.jfr.internal.EventInstrumentation; +import jdk.jfr.internal.consumer.ObjectContext; /** * A recorded event. @@ -39,17 +40,14 @@ * @since 9 */ public final class RecordedEvent extends RecordedObject { - private final EventType eventType; - private final long startTime; - // package private needed for efficient sorting - final long endTime; + long startTimeTicks; + long endTimeTicks; // package private - RecordedEvent(EventType type, List vds, Object[] values, long startTime, long endTime, TimeConverter timeConverter) { - super(vds, values, timeConverter); - this.eventType = type; - this.startTime = startTime; - this.endTime = endTime; + RecordedEvent(ObjectContext objectContext, Object[] values, long startTimeTicks, long endTimeTicks) { + super(objectContext, values); + this.startTimeTicks = startTimeTicks; + this.endTimeTicks = endTimeTicks; } /** @@ -78,7 +76,7 @@ * @return the event type, not {@code null} */ public EventType getEventType() { - return eventType; + return objectContext.eventType; } /** @@ -89,7 +87,7 @@ * @return the start time, not {@code null} */ public Instant getStartTime() { - return Instant.ofEpochSecond(0, startTime); + return Instant.ofEpochSecond(0, getStartTimeNanos()); } /** @@ -100,7 +98,7 @@ * @return the end time, not {@code null} */ public Instant getEndTime() { - return Instant.ofEpochSecond(0, endTime); + return Instant.ofEpochSecond(0, getEndTimeNanos()); } /** @@ -109,7 +107,7 @@ * @return the duration in nanoseconds, not {@code null} */ public Duration getDuration() { - return Duration.ofNanos(endTime - startTime); + return Duration.ofNanos(getEndTimeNanos() - getStartTimeNanos()); } /** @@ -119,6 +117,31 @@ */ @Override public List getFields() { - return getEventType().getFields(); + return objectContext.fields; + } + + protected final Object objectAt(int index) { + if (index == 0) { + return startTimeTicks; + } + if (hasDuration()) { + if (index == 1) { + return endTimeTicks - startTimeTicks; + } + return objects[index - 2]; + } + return objects[index - 1]; + } + + private boolean hasDuration() { + return objects.length + 2 == objectContext.fields.size(); + } + + private long getStartTimeNanos() { + return objectContext.convertTimestamp(startTimeTicks); + } + + private long getEndTimeNanos() { + return objectContext.convertTimestamp(endTimeTicks); } }