src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 52850 f527b24990d7
child 59226 a0f39cc47387
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@oracle.com, markus.gronlund@oracle.com
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;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
    private static final long METADATA_TYPE_ID = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
    private static final byte[] FILE_MAGIC = { 'F', 'L', 'R', '\0' };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
    private final short major;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
    private final short minor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
    private final long chunkStartTicks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
    private final long ticksPerSecond;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
    private final long chunkStartNanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
    private final long absoluteChunkStart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
    private final RecordingInput input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
    private final long id;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    53
    private long absoluteEventStart;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    54
    private long chunkSize = 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    55
    private long constantPoolPosition = 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    56
    private long metadataPosition = 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    57
    private long durationNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    58
    private long absoluteChunkEnd;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    59
    private boolean isFinished;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    60
    private boolean finished;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
    public ChunkHeader(RecordingInput input) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
        this(input, 0, 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
    private ChunkHeader(RecordingInput input, long absoluteChunkStart, long id) throws IOException {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    67
        this.absoluteChunkStart = absoluteChunkStart;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    68
        this.absoluteEventStart = absoluteChunkStart + HEADER_SIZE;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    69
        if (input.getFileSize() < HEADER_SIZE) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    70
            throw new IOException("Not a complete Chunk header");
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    71
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    72
        input.setValidSize(absoluteChunkStart + HEADER_SIZE);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
        input.position(absoluteChunkStart);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
        if (input.position() >= input.size()) {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    75
           throw new IOException("Chunk contains no data");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
        verifyMagic(input);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
        this.input = input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
        this.id = id;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    80
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: " + id);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    81
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: file=" + input.getFilename());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startPosition=" + absoluteChunkStart);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
        major = input.readRawShort();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: major=" + major);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
        minor = input.readRawShort();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: minor=" + minor);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        if (major != 1 && major != 2) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
            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
    89
        }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    90
        input.readRawLong(); // chunk size
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: chunkSize=" + chunkSize);
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    92
        input.readRawLong(); // constant pool position
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: constantPoolPosition=" + constantPoolPosition);
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
    94
        input.readRawLong(); // metadata position
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: metadataPosition=" + metadataPosition);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
        chunkStartNanos = input.readRawLong(); // nanos since epoch
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startNanos=" + chunkStartNanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
        durationNanos = input.readRawLong(); // duration nanos, not used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos=" + durationNanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        chunkStartTicks = input.readRawLong();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: startTicks=" + chunkStartTicks);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
        ticksPerSecond = input.readRawLong();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: ticksPerSecond=" + ticksPerSecond);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
        input.readRawInt(); // features, not used
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   106
        refresh();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   107
        input.position(absoluteEventStart);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   108
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   110
    void refresh() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   111
        while (true) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   112
            byte fileState1;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   113
            input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   114
            while ((fileState1 = input.readPhysicalByte()) == UPDATING_CHUNK_HEADER) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   115
                Utils.takeNap(1);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   116
                input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   117
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   118
            input.positionPhysical(absoluteChunkStart + CHUNK_SIZE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   119
            long chunkSize = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   120
            long constantPoolPosition = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   121
            long metadataPosition = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   122
            input.positionPhysical(absoluteChunkStart + DURATION_NANOS_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   123
            long durationNanos = input.readPhysicalLong();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   124
            input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   125
            byte fileState2 =  input.readPhysicalByte();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   126
            if (fileState1 == fileState2) { // valid header
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   127
                finished = fileState1 == 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   128
                if (metadataPosition != 0) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   129
                    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
   130
                    if (finished) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   131
                        // This assumes that the whole recording
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   132
                        // is finished if the first chunk is.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   133
                        // This is a limitation we may want to
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   134
                        // remove, but greatly improves performance as
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   135
                        // data can be read across chunk boundaries
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   136
                        // of multi-chunk files and only once.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   137
                        input.setValidSize(input.getFileSize());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   138
                    } else {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   139
                        input.setValidSize(absoluteChunkStart + chunkSize);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   140
                    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   141
                    this.chunkSize = chunkSize;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   142
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: chunkSize=" + chunkSize);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   143
                    this.constantPoolPosition = constantPoolPosition;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   144
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: constantPoolPosition=" + constantPoolPosition);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   145
                    this.metadataPosition = metadataPosition;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   146
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: metadataPosition=" + metadataPosition);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   147
                    this.durationNanos = durationNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   148
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: durationNanos =" + durationNanos);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   149
                    isFinished = fileState2 == 0;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   150
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: generation=" + fileState2);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   151
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: finished=" + isFinished);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   152
                    Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Chunk: fileSize=" + input.size());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   153
                    absoluteChunkEnd = absoluteChunkStart + chunkSize;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   154
                    return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   155
                }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   156
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   157
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   158
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   159
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   160
    public void awaitFinished() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   161
        if (finished) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   162
            return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   163
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   164
        long pos = input.position();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   165
        try {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   166
            input.positionPhysical(absoluteChunkStart + FILE_STATE_POSITION);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   167
            while (true) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   168
                byte filestate = input.readPhysicalByte();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   169
                if (filestate == 0) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   170
                    finished = true;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   171
                    return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   172
                }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   173
                Utils.takeNap(1);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   174
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   175
        } finally {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   176
            input.position(pos);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   177
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   178
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   179
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   180
    public boolean isLastChunk() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   181
        awaitFinished();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   182
        // streaming files only have one chunk
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   183
        return input.getFileSize() == absoluteChunkEnd;
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 isFinished() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   187
        return isFinished;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
    public ChunkHeader nextHeader() throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
        return new ChunkHeader(input, absoluteChunkEnd, id + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
    }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   193
    public MetadataDescriptor readMetadata() throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   194
        return readMetadata(null);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   195
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   197
    public MetadataDescriptor readMetadata(MetadataDescriptor previous) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
        input.position(absoluteChunkStart + metadataPosition);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
        input.readInt(); // size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
        long id = input.readLong(); // event type id
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
        if (id != METADATA_TYPE_ID) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
            throw new IOException("Expected metadata event. Type id=" + id + ", should have been " + METADATA_TYPE_ID);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
        input.readLong(); // start time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
        input.readLong(); // duration
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
        long metadataId = input.readLong();
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   207
        if (previous != null && metadataId == previous.metadataId) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   208
            return previous;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   209
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   210
        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, "New metadata id = " + metadataId);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   211
        MetadataDescriptor m =  MetadataDescriptor.read(input);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   212
        m.metadataId = metadataId;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   213
        return m;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
    public short getMajor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
        return major;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
    public short getMinor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
        return minor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
    public long getAbsoluteChunkStart() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
        return absoluteChunkStart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   229
    public long getAbsoluteEventStart() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   230
        return absoluteEventStart;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   231
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
    public long getConstantPoolPosition() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
        return constantPoolPosition;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   236
    public long getMetataPosition() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   237
        return metadataPosition;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   238
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
    public long getStartTicks() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
        return chunkStartTicks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
    }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   242
    public long getChunkSize() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   243
        return chunkSize;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   244
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
    public double getTicksPerSecond() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
        return ticksPerSecond;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
    public long getStartNanos() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
        return chunkStartNanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
    public long getEnd() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        return absoluteChunkEnd;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
    public long getSize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
        return chunkSize;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
52850
f527b24990d7 8205516: JFR tool
egahlin
parents: 50113
diff changeset
   262
    public long getDurationNanos() {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
        return durationNanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
    public RecordingInput getInput() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
        return input;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   270
    private static void verifyMagic(RecordingInput input) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
        for (byte c : FILE_MAGIC) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
            if (input.readByte() != c) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
                throw new IOException("Not a Flight Recorder file");
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
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
    public long getEventStart() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
        return absoluteEventStart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   282
    static long headerSize() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   283
        return HEADER_SIZE;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 52850
diff changeset
   284
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
}