src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java
changeset 59226 a0f39cc47387
parent 58863 c16ac7a2eba4
child 59274 eb3e2a5c2bcd
equal deleted inserted replaced
59225:80e1201f6c9a 59226:a0f39cc47387
    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         }
   181         awaitFinished();
   187         awaitFinished();
   182         // streaming files only have one chunk
   188         // streaming files only have one chunk
   183         return input.getFileSize() == absoluteChunkEnd;
   189         return input.getFileSize() == absoluteChunkEnd;
   184    }
   190    }
   185 
   191 
       
   192     public boolean isFinalChunk() {
       
   193         return finalChunk;
       
   194     }
       
   195 
   186     public boolean isFinished() throws IOException {
   196     public boolean isFinished() throws IOException {
   187         return isFinished;
   197         return isFinished;
   188     }
   198     }
   189 
   199 
   190     public ChunkHeader nextHeader() throws IOException {
   200     public ChunkHeader nextHeader() throws IOException {