37 private static final long HEADER_SIZE = 68; |
37 private static final long HEADER_SIZE = 68; |
38 private static final byte UPDATING_CHUNK_HEADER = (byte) 255; |
38 private static final byte UPDATING_CHUNK_HEADER = (byte) 255; |
39 private static final long CHUNK_SIZE_POSITION = 8; |
39 private static final long CHUNK_SIZE_POSITION = 8; |
40 private static final long DURATION_NANOS_POSITION = 40; |
40 private static final long DURATION_NANOS_POSITION = 40; |
41 private static final long FILE_STATE_POSITION = 64; |
41 private static final long FILE_STATE_POSITION = 64; |
|
42 private static final long FLAG_BYTE_POSITION = 67; |
42 private static final long METADATA_TYPE_ID = 0; |
43 private static final long METADATA_TYPE_ID = 0; |
43 private static final byte[] FILE_MAGIC = { 'F', 'L', 'R', '\0' }; |
44 private static final byte[] FILE_MAGIC = { 'F', 'L', 'R', '\0' }; |
|
45 private static final int MASK_FINAL_CHUNK = 1 << 1; |
44 |
46 |
45 private final short major; |
47 private final short major; |
46 private final short minor; |
48 private final short minor; |
47 private final long chunkStartTicks; |
49 private final long chunkStartTicks; |
48 private final long ticksPerSecond; |
50 private final long ticksPerSecond; |
56 private long metadataPosition = 0; |
58 private long metadataPosition = 0; |
57 private long durationNanos; |
59 private long durationNanos; |
58 private long absoluteChunkEnd; |
60 private long absoluteChunkEnd; |
59 private boolean isFinished; |
61 private boolean isFinished; |
60 private boolean finished; |
62 private boolean finished; |
|
63 private boolean finalChunk; |
61 |
64 |
62 public ChunkHeader(RecordingInput input) throws IOException { |
65 public ChunkHeader(RecordingInput input) throws IOException { |
63 this(input, 0, 0); |
66 this(input, 0, 0); |
64 } |
67 } |
65 |
68 |
99 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos=" + durationNanos); |
102 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos=" + durationNanos); |
100 chunkStartTicks = input.readRawLong(); |
103 chunkStartTicks = input.readRawLong(); |
101 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startTicks=" + chunkStartTicks); |
104 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startTicks=" + chunkStartTicks); |
102 ticksPerSecond = input.readRawLong(); |
105 ticksPerSecond = input.readRawLong(); |
103 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: ticksPerSecond=" + ticksPerSecond); |
106 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: ticksPerSecond=" + ticksPerSecond); |
104 input.readRawInt(); // features, not used |
107 input.readRawInt(); // ignore file state and flag bits |
105 |
|
106 refresh(); |
108 refresh(); |
107 input.position(absoluteEventStart); |
109 input.position(absoluteEventStart); |
108 } |
110 } |
109 |
111 |
110 void refresh() throws IOException { |
112 void refresh() throws IOException { |
121 long metadataPosition = input.readPhysicalLong(); |
123 long metadataPosition = input.readPhysicalLong(); |
122 input.positionPhysical(absoluteChunkStart + DURATION_NANOS_POSITION); |
124 input.positionPhysical(absoluteChunkStart + DURATION_NANOS_POSITION); |
123 long durationNanos = input.readPhysicalLong(); |
125 long durationNanos = input.readPhysicalLong(); |
124 input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION); |
126 input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION); |
125 byte fileState2 = input.readPhysicalByte(); |
127 byte fileState2 = input.readPhysicalByte(); |
|
128 input.positionPhysical(absoluteChunkStart + FLAG_BYTE_POSITION); |
|
129 int flagByte = input.readPhysicalByte(); |
126 if (fileState1 == fileState2) { // valid header |
130 if (fileState1 == fileState2) { // valid header |
127 finished = fileState1 == 0; |
131 finished = fileState1 == 0; |
128 if (metadataPosition != 0) { |
132 if (metadataPosition != 0) { |
129 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Setting input size to " + (absoluteChunkStart + chunkSize)); |
133 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Setting input size to " + (absoluteChunkStart + chunkSize)); |
130 if (finished) { |
134 if (finished) { |
148 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos =" + durationNanos); |
152 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos =" + durationNanos); |
149 isFinished = fileState2 == 0; |
153 isFinished = fileState2 == 0; |
150 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: generation=" + fileState2); |
154 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: generation=" + fileState2); |
151 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: finished=" + isFinished); |
155 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: finished=" + isFinished); |
152 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: fileSize=" + input.size()); |
156 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: fileSize=" + input.size()); |
|
157 this.finalChunk = (flagByte & MASK_FINAL_CHUNK) != 0; |
|
158 Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: finalChunk=" + finalChunk); |
153 absoluteChunkEnd = absoluteChunkStart + chunkSize; |
159 absoluteChunkEnd = absoluteChunkStart + chunkSize; |
154 return; |
160 return; |
155 } |
161 } |
156 } |
162 } |
157 } |
163 } |