src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java
author egahlin
Fri, 22 Nov 2019 17:20:43 +0100
changeset 59226 a0f39cc47387
parent 58863 c16ac7a2eba4
child 59274 eb3e2a5c2bcd
permissions -rw-r--r--
8233700: EventStream not closed Reviewed-by: mgronlun, mseledtsov
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
package jdk.jfr.internal.consumer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import jdk.jfr.internal.LogLevel;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import jdk.jfr.internal.LogTag;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import jdk.jfr.internal.Logger;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import jdk.jfr.internal.MetadataDescriptor;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    34
import jdk.jfr.internal.Utils;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
public final class ChunkHeader {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    37
    private static final long HEADER_SIZE = 68;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    38
    private static final byte UPDATING_CHUNK_HEADER = (byte) 255;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    39
    private static final long CHUNK_SIZE_POSITION = 8;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    40
    private static final long DURATION_NANOS_POSITION = 40;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    41
    private static final long FILE_STATE_POSITION = 64;
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
    42
    private static final long FLAG_BYTE_POSITION = 67;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
    private static final long METADATA_TYPE_ID = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
    private static final byte[] FILE_MAGIC = { 'F', 'L', 'R', '\0' };
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
    45
    private static final int MASK_FINAL_CHUNK = 1 << 1;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
    private final short major;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
    private final short minor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
    private final long chunkStartTicks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
    private final long ticksPerSecond;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
    private final long chunkStartNanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
    private final long absoluteChunkStart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
    private final RecordingInput input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
    private final long id;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    55
    private long absoluteEventStart;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    56
    private long chunkSize = 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    57
    private long constantPoolPosition = 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    58
    private long metadataPosition = 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    59
    private long durationNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    60
    private long absoluteChunkEnd;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    61
    private boolean isFinished;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    62
    private boolean finished;
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
    63
    private boolean finalChunk;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
    public ChunkHeader(RecordingInput input) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
        this(input, 0, 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
    private ChunkHeader(RecordingInput input, long absoluteChunkStart, long id) throws IOException {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    70
        this.absoluteChunkStart = absoluteChunkStart;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    71
        this.absoluteEventStart = absoluteChunkStart + HEADER_SIZE;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    72
        if (input.getFileSize() < HEADER_SIZE) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    73
            throw new IOException("Not a complete Chunk header");
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    74
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    75
        input.setValidSize(absoluteChunkStart + HEADER_SIZE);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
        input.position(absoluteChunkStart);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
        if (input.position() >= input.size()) {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    78
           throw new IOException("Chunk contains no data");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
        verifyMagic(input);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        this.input = input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        this.id = id;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    83
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: " + id);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    84
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: file=" + input.getFilename());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startPosition=" + absoluteChunkStart);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
        major = input.readRawShort();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: major=" + major);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
        minor = input.readRawShort();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: minor=" + minor);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
        if (major != 1 && major != 2) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
            throw new IOException("File version " + major + "." + minor + ". Only Flight Recorder files of version 1.x and 2.x can be read by this JDK.");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
        }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    93
        input.readRawLong(); // chunk size
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: chunkSize=" + chunkSize);
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    95
        input.readRawLong(); // constant pool position
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: constantPoolPosition=" + constantPoolPosition);
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    97
        input.readRawLong(); // metadata position
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: metadataPosition=" + metadataPosition);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
        chunkStartNanos = input.readRawLong(); // nanos since epoch
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startNanos=" + chunkStartNanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
        durationNanos = input.readRawLong(); // duration nanos, not used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos=" + durationNanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        chunkStartTicks = input.readRawLong();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startTicks=" + chunkStartTicks);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
        ticksPerSecond = input.readRawLong();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: ticksPerSecond=" + ticksPerSecond);
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   107
        input.readRawInt(); // ignore file state and flag bits
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   108
        refresh();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   109
        input.position(absoluteEventStart);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   110
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   112
    void refresh() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   113
        while (true) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   114
            byte fileState1;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   115
            input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   116
            while ((fileState1 = input.readPhysicalByte()) == UPDATING_CHUNK_HEADER) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   117
                Utils.takeNap(1);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   118
                input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   119
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   120
            input.positionPhysical(absoluteChunkStart + CHUNK_SIZE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   121
            long chunkSize = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   122
            long constantPoolPosition = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   123
            long metadataPosition = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   124
            input.positionPhysical(absoluteChunkStart + DURATION_NANOS_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   125
            long durationNanos = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   126
            input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   127
            byte fileState2 =  input.readPhysicalByte();
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   128
            input.positionPhysical(absoluteChunkStart + FLAG_BYTE_POSITION);
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   129
            int flagByte = input.readPhysicalByte();
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   130
            if (fileState1 == fileState2) { // valid header
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   131
                finished = fileState1 == 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   132
                if (metadataPosition != 0) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   133
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Setting input size to " + (absoluteChunkStart + chunkSize));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   134
                    if (finished) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   135
                        // This assumes that the whole recording
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   136
                        // is finished if the first chunk is.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   137
                        // This is a limitation we may want to
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   138
                        // remove, but greatly improves performance as
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   139
                        // data can be read across chunk boundaries
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   140
                        // of multi-chunk files and only once.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   141
                        input.setValidSize(input.getFileSize());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   142
                    } else {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   143
                        input.setValidSize(absoluteChunkStart + chunkSize);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   144
                    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   145
                    this.chunkSize = chunkSize;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   146
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: chunkSize=" + chunkSize);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   147
                    this.constantPoolPosition = constantPoolPosition;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   148
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: constantPoolPosition=" + constantPoolPosition);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   149
                    this.metadataPosition = metadataPosition;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   150
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: metadataPosition=" + metadataPosition);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   151
                    this.durationNanos = durationNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   152
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos =" + durationNanos);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   153
                    isFinished = fileState2 == 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   154
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: generation=" + fileState2);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   155
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: finished=" + isFinished);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   156
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: fileSize=" + input.size());
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   157
                    this.finalChunk = (flagByte & MASK_FINAL_CHUNK) != 0;
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   158
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: finalChunk=" + finalChunk);
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   159
                    absoluteChunkEnd = absoluteChunkStart + chunkSize;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   160
                    return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   161
                }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   162
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   163
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   164
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   165
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   166
    public void awaitFinished() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   167
        if (finished) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   168
            return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   169
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   170
        long pos = input.position();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   171
        try {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   172
            input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   173
            while (true) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   174
                byte filestate = input.readPhysicalByte();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   175
                if (filestate == 0) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   176
                    finished = true;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   177
                    return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   178
                }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   179
                Utils.takeNap(1);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   180
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   181
        } finally {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   182
            input.position(pos);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   183
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   184
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   185
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   186
    public boolean isLastChunk() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   187
        awaitFinished();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   188
        // streaming files only have one chunk
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   189
        return input.getFileSize() == absoluteChunkEnd;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   190
   }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   191
59226
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   192
    public boolean isFinalChunk() {
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   193
        return finalChunk;
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   194
    }
a0f39cc47387 8233700: EventStream not closed
egahlin
parents: 58863
diff changeset
   195
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   196
    public boolean isFinished() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   197
        return isFinished;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    public ChunkHeader nextHeader() throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
        return new ChunkHeader(input, absoluteChunkEnd, id + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   203
    public MetadataDescriptor readMetadata() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   204
        return readMetadata(null);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   205
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   207
    public MetadataDescriptor readMetadata(MetadataDescriptor previous) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
        input.position(absoluteChunkStart + metadataPosition);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        input.readInt(); // size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
        long id = input.readLong(); // event type id
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
        if (id != METADATA_TYPE_ID) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
            throw new IOException("Expected metadata event. Type id=" + id + ", should have been " + METADATA_TYPE_ID);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
        input.readLong(); // start time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
        input.readLong(); // duration
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
        long metadataId = input.readLong();
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   217
        if (previous != null && metadataId == previous.metadataId) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   218
            return previous;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   219
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   220
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, "New metadata id = " + metadataId);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   221
        MetadataDescriptor m =  MetadataDescriptor.read(input);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   222
        m.metadataId = metadataId;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   223
        return m;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
    public short getMajor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
        return major;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
    public short getMinor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        return minor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
    public long getAbsoluteChunkStart() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
        return absoluteChunkStart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   239
    public long getAbsoluteEventStart() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   240
        return absoluteEventStart;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   241
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
    public long getConstantPoolPosition() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
        return constantPoolPosition;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   246
    public long getMetataPosition() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   247
        return metadataPosition;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   248
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
    public long getStartTicks() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
        return chunkStartTicks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
    }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   252
    public long getChunkSize() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   253
        return chunkSize;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   254
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
    public double getTicksPerSecond() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
        return ticksPerSecond;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
    public long getStartNanos() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
        return chunkStartNanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
    public long getEnd() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
        return absoluteChunkEnd;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
    public long getSize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
        return chunkSize;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
52850
f527b24990d7 8205516: JFR tool
egahlin
parents: 50113
diff changeset
   272
    public long getDurationNanos() {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
        return durationNanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
    public RecordingInput getInput() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
        return input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   280
    private static void verifyMagic(RecordingInput input) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
        for (byte c : FILE_MAGIC) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
            if (input.readByte() != c) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
                throw new IOException("Not a Flight Recorder file");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
    public long getEventStart() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
        return absoluteEventStart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   292
    static long headerSize() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   293
        return HEADER_SIZE;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   294
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
}