src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp
author mgronlun
Sat, 24 Aug 2019 14:30:27 +0200
branchJEP-349-branch
changeset 57870 00860d9caf4d
parent 57360 5d043a159d5c
child 57872 7aa1b3d6ff8f
permissions -rw-r--r--
New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 53897
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.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
#include "precompiled.hpp"
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
    26
#include "jfrfiles/jfrEventClasses.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "jfr/jni/jfrJavaSupport.hpp"
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    28
#include "jfr/leakprofiler/leakProfiler.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp"
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
    30
#include "jfr/leakprofiler/sampling/objectSampler.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include "jfr/recorder/jfrRecorder.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
#include "jfr/recorder/checkpoint/jfrMetadataEvent.hpp"
53014
339d2fbe8675 8215284: Reduce noise induced by periodic task getFileSize()
mgronlun
parents: 52877
diff changeset
    34
#include "jfr/recorder/repository/jfrChunkRotation.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
#include "jfr/recorder/repository/jfrChunkWriter.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
#include "jfr/recorder/repository/jfrRepository.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include "jfr/recorder/service/jfrPostBox.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
#include "jfr/recorder/service/jfrRecorderService.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
#include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
#include "jfr/recorder/storage/jfrStorage.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
#include "jfr/recorder/storage/jfrStorageControl.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
#include "jfr/recorder/stringpool/jfrStringPool.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
#include "jfr/utilities/jfrAllocation.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
#include "jfr/utilities/jfrTime.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
#include "jfr/writers/jfrJavaEventWriter.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
#include "jfr/utilities/jfrTypes.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
#include "logging/log.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
#include "memory/resourceArea.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
#include "runtime/atomic.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
#include "runtime/handles.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
#include "runtime/mutexLocker.hpp"
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 50113
diff changeset
    52
#include "runtime/orderAccess.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
#include "runtime/os.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
#include "runtime/safepoint.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
#include "runtime/thread.inline.hpp"
52877
9e041366c764 8214850: Rename vm_operations.?pp files to vmOperations.?pp files
tschatzl
parents: 51334
diff changeset
    56
#include "runtime/vmOperations.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
#include "runtime/vmThread.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
// set data iff *dest == NULL
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
static bool try_set(void* const data, void** dest, bool clear) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  assert(data != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
  const void* const current = OrderAccess::load_acquire(dest);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
  if (current != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    if (current != data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
      // already set
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    assert(current == data, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
    if (!clear) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
      // recursion disallowed
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
  return Atomic::cmpxchg(clear ? NULL : data, dest, current) == current;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
static void* rotation_thread = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
static const int rotation_try_limit = 1000;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
static const int rotation_retry_sleep_millis = 10;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
    81
// incremented on each flushpoint
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
    82
static u8 flushpoint_id = 0;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
    83
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
class RotationLock : public StackObj {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
  Thread* const _thread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
  bool _acquired;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
  void log(bool recursion) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
    assert(!_acquired, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
    const char* error_msg = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
    if (recursion) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
      error_msg = "Unable to issue rotation due to recursive calls.";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
    else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
      error_msg = "Unable to issue rotation due to wait timeout.";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
    log_info(jfr)( // For user, should not be "jfr, system"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
      "%s", error_msg);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
 public:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
  RotationLock(Thread* thread) : _thread(thread), _acquired(false) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
    assert(_thread != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
    if (_thread == rotation_thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
      // recursion not supported
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
      log(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
      return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
    // limited to not spin indefinitely
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
    for (int i = 0; i < rotation_try_limit; ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
      if (try_set(_thread, &rotation_thread, false)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
        _acquired = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
        assert(_thread == rotation_thread, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
        return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
      if (_thread->is_Java_thread()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
        // in order to allow the system to move to a safepoint
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 53897
diff changeset
   119
        MutexLocker msg_lock(JfrMsg_lock);
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 53897
diff changeset
   120
        JfrMsg_lock->wait(rotation_retry_sleep_millis);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
      else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
        os::naked_short_sleep(rotation_retry_sleep_millis);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
    log(false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
  ~RotationLock() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
    assert(_thread != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    if (_acquired) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
      assert(_thread == rotation_thread, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
      while (!try_set(_thread, &rotation_thread, true));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
  bool not_acquired() const { return !_acquired; }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   139
template <typename E, typename Instance, size_t(Instance::*func)()>
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   140
class ServiceFunctor {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   141
 private:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   142
  Instance& _instance;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   143
  u4 _elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   144
 public:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   145
  typedef E EventType;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   146
  ServiceFunctor(Instance& instance) : _instance(instance), _elements(0) {}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   147
  bool process() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   148
    _elements = (u4)(_instance.*func)();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   149
    return true;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   150
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   151
  u4 elements() const { return _elements; }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   152
};
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   153
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   154
template <typename ContentFunctor>
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   155
class WriteSubsystem : public StackObj {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   156
 protected:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   157
  const JfrTicks _start_time;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   158
  JfrTicks _end_time;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   159
  JfrChunkWriter& _cw;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   160
  ContentFunctor& _content_functor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   161
  const int64_t _start_offset;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   162
 public:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   163
  typedef typename ContentFunctor::EventType EventType;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   164
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   165
  WriteSubsystem(JfrChunkWriter& cw, ContentFunctor& functor) :
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   166
    _start_time(JfrTicks::now()),
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   167
    _end_time(),
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   168
    _cw(cw),
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   169
    _content_functor(functor),
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   170
    _start_offset(_cw.current_offset()) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   171
    assert(_cw.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   172
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   173
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   174
  bool process() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   175
    // invocation
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   176
    _content_functor.process();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   177
    _end_time = JfrTicks::now();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   178
    return 0 != _content_functor.elements();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   179
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   180
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   181
  const JfrTicks& start_time() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   182
    return _start_time;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   183
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   184
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   185
  const JfrTicks& end_time() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   186
    return _end_time;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   187
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   188
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   189
  int64_t start_offset() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   190
    return _start_offset;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   191
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   192
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   193
  int64_t end_offset() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   194
    return current_offset();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   195
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   196
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   197
  int64_t current_offset() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   198
    return _cw.current_offset();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   199
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   200
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   201
  u4 elements() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   202
    return (u4) _content_functor.elements();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   203
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   204
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   205
  u4 size() const {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   206
    return (u4)(end_offset() - start_offset());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   207
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   208
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   209
  static bool is_event_enabled() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   210
    return EventType::is_enabled();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   211
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   212
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   213
  static u8 event_id() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   214
    return EventType::eventId;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   215
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   216
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   217
  void write_elements(int64_t offset) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   218
    _cw.write_padded_at_offset<u4>(elements(), offset);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   219
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   220
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   221
  void write_size() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   222
    _cw.write_padded_at_offset<u4>(size(), start_offset());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   223
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   224
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   225
  void set_last_checkpoint() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   226
    _cw.set_last_checkpoint_offset(start_offset());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   227
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   228
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   229
  void rewind() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   230
    _cw.seek(start_offset());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   231
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   232
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   233
};
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   234
53897
0abec72a3ac2 8217647: JFR: recordings on 32-bit systems unreadable
bulasevich
parents: 53014
diff changeset
   235
static int64_t write_checkpoint_event_prologue(JfrChunkWriter& cw, u8 type_id) {
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   236
  const int64_t last_cp_offset = cw.last_checkpoint_offset();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   237
  const int64_t last_cp_relative_offset = 0 == last_cp_offset ? 0 : last_cp_offset - cw.current_offset();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  cw.reserve(sizeof(u4));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
  cw.write<u8>(EVENT_CHECKPOINT);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
  cw.write(JfrTicks::now());
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   241
  cw.write<int64_t>((int64_t)0);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   242
  cw.write(last_cp_relative_offset); // write last checkpoint offset delta
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  cw.write<bool>(false); // flushpoint
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   244
  cw.write<u4>((u4)1); // nof types in this checkpoint
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   245
  cw.write<u8>(type_id);
53897
0abec72a3ac2 8217647: JFR: recordings on 32-bit systems unreadable
bulasevich
parents: 53014
diff changeset
   246
  const int64_t number_of_elements_offset = cw.current_offset();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
  cw.reserve(sizeof(u4));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
  return number_of_elements_offset;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
template <typename ContentFunctor>
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   252
class WriteSubsystemCheckpointEvent : public WriteSubsystem<ContentFunctor> {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
 private:
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   254
  const u8 _type_id;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
 public:
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   256
  WriteSubsystemCheckpointEvent(JfrChunkWriter& cw, ContentFunctor& functor, u8 type_id) :
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   257
    WriteSubsystem<ContentFunctor>(cw, functor), _type_id(type_id) {}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   258
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
  bool process() {
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   260
    const int64_t num_elements_offset = write_checkpoint_event_prologue(this->_cw, _type_id);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   261
    if (!WriteSubsystem<ContentFunctor>::process()) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
      // nothing to do, rewind writer to start
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   263
      this->rewind();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   264
      assert(this->current_offset() == this->start_offset(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   265
      return false;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
    }
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   267
    assert(this->elements() > 0, "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   268
    assert(this->current_offset() > num_elements_offset, "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   269
    this->write_elements(num_elements_offset);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   270
    this->write_size();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   271
    this->set_last_checkpoint();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   276
template <typename Functor>
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   277
static void write_flush_event(Functor& f) {
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   278
  if (Functor::is_event_enabled()) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   279
    typename Functor::EventType e(UNTIMED);
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   280
    e.set_starttime(f.start_time());
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   281
    e.set_endtime(f.end_time());
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   282
    e.set_flushId(flushpoint_id);
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   283
    e.set_elements(f.elements());
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   284
    e.set_size(f.size());
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   285
    e.commit();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
  }
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   287
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   288
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   289
template <typename Functor>
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   290
static u4 invoke(Functor& f) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   291
  f.process();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   292
  return f.elements();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   293
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   294
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   295
template <typename Functor>
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   296
static u4 invoke_with_flush_event(Functor& f) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   297
  const u4 elements = invoke(f);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   298
  if (elements != 0) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   299
    write_flush_event(f);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   300
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   301
  return elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   302
}
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
template <typename Instance, void(Instance::*func)()>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
class JfrVMOperation : public VM_Operation {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
  Instance& _instance;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
 public:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
  JfrVMOperation(Instance& instance) : _instance(instance) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
  void doit() { (_instance.*func)(); }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
  VMOp_Type type() const { return VMOp_JFRCheckpoint; }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
  Mode evaluation_mode() const { return _safepoint; } // default
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   315
class FlushStackTraceRepository : public StackObj {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
  JfrStackTraceRepository& _repo;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
  JfrChunkWriter& _cw;
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   319
  size_t _elements;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
  bool _clear;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
 public:
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   323
  typedef EventFlushStacktrace EventType;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   324
  FlushStackTraceRepository(JfrStackTraceRepository& repo, JfrChunkWriter& cw, bool clear) :
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   325
    _repo(repo), _cw(cw), _elements(0), _clear(clear) {}
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
  bool process() {
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   327
    _elements = _repo.write(_cw, _clear);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
  }
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   330
  size_t elements() const { return _elements; }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   331
  void reset() { _elements = 0; }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   332
};
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   333
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   334
class FlushMetadataEvent : public StackObj {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   335
 private:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   336
  JfrChunkWriter& _cw;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   337
 public:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   338
  typedef EventFlushMetadata EventType;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   339
  FlushMetadataEvent(JfrChunkWriter& cw) : _cw(cw) {}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   340
  bool process() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   341
    JfrMetadataEvent::write(_cw);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   342
    return true;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   343
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   344
  size_t elements() const { return 1; }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
static bool recording = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
static void set_recording_state(bool is_recording) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
  OrderAccess::storestore();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
  recording = is_recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
bool JfrRecorderService::is_recording() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
  return recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
JfrRecorderService::JfrRecorderService() :
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
  _checkpoint_manager(JfrCheckpointManager::instance()),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
  _chunkwriter(JfrRepository::chunkwriter()),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
  _repository(JfrRepository::instance()),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   362
  _stack_trace_repository(JfrStackTraceRepository::instance()),
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
  _storage(JfrStorage::instance()),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
  _string_pool(JfrStringPool::instance()) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
void JfrRecorderService::start() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
  RotationLock rl(Thread::current());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
  if (rl.not_acquired()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
  log_debug(jfr, system)("Request to START recording");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
  assert(!is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
  clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
  set_recording_state(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
  assert(is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
  open_new_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
  log_debug(jfr, system)("Recording STARTED");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
void JfrRecorderService::clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
  ResourceMark rm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
  HandleMark hm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
  pre_safepoint_clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
  invoke_safepoint_clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
  post_safepoint_clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
void JfrRecorderService::pre_safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
  _stack_trace_repository.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
  _string_pool.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
  _storage.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
void JfrRecorderService::invoke_safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
  JfrVMOperation<JfrRecorderService, &JfrRecorderService::safepoint_clear> safepoint_task(*this);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
  VMThread::execute(&safepoint_task);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
// safepoint clear sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
//  clear stacktrace repository ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
//    clear string pool ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
//      clear storage ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
//        shift epoch ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
//          update time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
void JfrRecorderService::safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
  assert(SafepointSynchronize::is_at_safepoint(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
  _stack_trace_repository.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
  _string_pool.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
  _storage.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
  _checkpoint_manager.shift_epoch();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
  _chunkwriter.time_stamp_chunk_now();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
void JfrRecorderService::post_safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
  _checkpoint_manager.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
static void stop() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
  assert(JfrRecorderService::is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
  log_debug(jfr, system)("Recording STOPPED");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
  set_recording_state(false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
  assert(!JfrRecorderService::is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
void JfrRecorderService::rotate(int msgs) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
  RotationLock rl(Thread::current());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
  if (rl.not_acquired()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
  static bool vm_error = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
  if (msgs & MSGBIT(MSG_VM_ERROR)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
    vm_error = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   436
    prepare_for_vm_error_rotation();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   437
  }
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   438
  if (!_storage.control().to_disk()) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   439
    in_memory_rotation();
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   440
  } else if (vm_error) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   441
    vm_error_rotation();
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   442
  } else {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   443
    chunk_rotation();
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   444
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   445
  if (msgs & (MSGBIT(MSG_STOP))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   446
    stop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   447
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   448
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   449
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
void JfrRecorderService::prepare_for_vm_error_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
  if (!_chunkwriter.is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   452
    open_new_chunk(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   453
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   454
  _checkpoint_manager.register_service_thread(Thread::current());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   455
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   456
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   457
void JfrRecorderService::open_new_chunk(bool vm_error) {
53014
339d2fbe8675 8215284: Reduce noise induced by periodic task getFileSize()
mgronlun
parents: 52877
diff changeset
   458
  JfrChunkRotation::on_rotation();
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   459
  const bool valid_chunk = _repository.open_chunk(vm_error);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   460
  _storage.control().set_to_disk(valid_chunk);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   461
  if (valid_chunk) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   462
    _checkpoint_manager.write_constants();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   463
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   464
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   465
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   466
void JfrRecorderService::in_memory_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   467
  // currently running an in-memory recording
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   468
  assert(!_storage.control().to_disk(), "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   469
  open_new_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   470
  if (_chunkwriter.is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   471
    // dump all in-memory buffer data to the newly created chunk
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   472
    serialize_storage_from_in_memory_recording();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   473
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   474
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   475
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   476
void JfrRecorderService::serialize_storage_from_in_memory_recording() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   477
  _storage.write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   478
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   479
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   480
void JfrRecorderService::chunk_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   481
  finalize_current_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   482
  open_new_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   483
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   484
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   485
void JfrRecorderService::finalize_current_chunk() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   486
  assert(_chunkwriter.is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   487
  write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   488
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   489
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   490
void JfrRecorderService::write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   491
  ResourceMark rm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   492
  HandleMark hm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   493
  pre_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   494
  invoke_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   495
  post_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   496
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   497
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   498
typedef ServiceFunctor<EventFlushStringPool, JfrStringPool, &JfrStringPool::write> FlushStringPoolFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   499
typedef ServiceFunctor<EventFlushStringPool, JfrStringPool, &JfrStringPool::write_at_safepoint> FlushStringPoolSafepointFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   500
typedef WriteSubsystemCheckpointEvent<FlushStackTraceRepository> FlushStackTraceCheckpoint;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   501
typedef WriteSubsystemCheckpointEvent<FlushStringPoolFunctor> FlushStringPoolCheckpoint;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   502
typedef WriteSubsystemCheckpointEvent<FlushStringPoolSafepointFunctor> FlushStringPoolCheckpointSafepoint;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   503
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   504
static u4 flush_stacktrace(JfrStackTraceRepository& stack_trace_repo, JfrChunkWriter& chunkwriter, bool clear) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   505
  FlushStackTraceRepository flush_stacktrace_repo(stack_trace_repo, chunkwriter, clear);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   506
  FlushStackTraceCheckpoint flush_stack_trace_checkpoint(chunkwriter, flush_stacktrace_repo, TYPE_STACKTRACE);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   507
  return invoke_with_flush_event(flush_stack_trace_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   508
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   509
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   510
static u4 flush_stacktrace(JfrStackTraceRepository& stack_trace_repo, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   511
  return flush_stacktrace(stack_trace_repo, chunkwriter, false);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   512
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   513
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   514
static u4 flush_stacktrace_checkpoint(JfrStackTraceRepository& stack_trace_repo, JfrChunkWriter& chunkwriter, bool clear) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   515
  FlushStackTraceRepository flush_stacktrace_repo(stack_trace_repo, chunkwriter, clear);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   516
  FlushStackTraceCheckpoint flush_stack_trace_checkpoint(chunkwriter, flush_stacktrace_repo, TYPE_STACKTRACE);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   517
  return invoke(flush_stack_trace_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   518
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   519
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   520
static u4 flush_stringpool(JfrStringPool& string_pool, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   521
  FlushStringPoolFunctor flush_string_pool(string_pool);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   522
  FlushStringPoolCheckpoint flush_string_pool_checkpoint(chunkwriter, flush_string_pool, TYPE_STRING);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   523
  return invoke_with_flush_event(flush_string_pool_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   524
}
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   525
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   526
static u4 flush_stringpool_checkpoint(JfrStringPool& string_pool, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   527
  FlushStringPoolFunctor flush_string_pool(string_pool);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   528
  FlushStringPoolCheckpoint flush_string_pool_checkpoint(chunkwriter, flush_string_pool, TYPE_STRING);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   529
  return invoke(flush_string_pool_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   530
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   531
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   532
static u4 flush_stringpool_checkpoint_safepoint(JfrStringPool& string_pool, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   533
  FlushStringPoolSafepointFunctor flush_string_pool(string_pool);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   534
  FlushStringPoolCheckpointSafepoint flush_string_pool_checkpoint(chunkwriter, flush_string_pool, TYPE_STRING);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   535
  return invoke(flush_string_pool_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   536
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   537
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   538
typedef ServiceFunctor<EventFlushTypeSet, JfrCheckpointManager, &JfrCheckpointManager::flush_type_set> FlushTypeSetFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   539
typedef WriteSubsystem<FlushTypeSetFunctor> FlushTypeSet;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   540
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   541
static u4 flush_typeset(JfrCheckpointManager& checkpoint_manager, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   542
  FlushTypeSetFunctor flush_type_set(checkpoint_manager);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   543
  FlushTypeSet fts(chunkwriter, flush_type_set);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   544
  return invoke_with_flush_event(fts);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   545
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   546
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   547
typedef WriteSubsystem<FlushMetadataEvent> FlushMetadata;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   548
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   549
static u4 flush_metadata_event(JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   550
  assert(chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   551
  FlushMetadataEvent fme(chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   552
  FlushMetadata fm(chunkwriter, fme);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   553
  return invoke_with_flush_event(fm);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   554
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   555
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   556
static u4 flush_metadata_event_checkpoint(JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   557
  assert(chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   558
  FlushMetadataEvent wme(chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   559
  FlushMetadata wm(chunkwriter, wme);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   560
  return invoke(wm);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   561
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   562
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   563
static JfrBuffer* thread_local_buffer() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   564
  return Thread::current()->jfr_thread_local()->native_buffer();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   565
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   566
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   567
static void reset_buffer(JfrBuffer* buffer) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   568
  assert(buffer != NULL, "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   569
  assert(buffer == thread_local_buffer(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   570
  buffer->set_pos(const_cast<u1*>(buffer->top()));
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   571
  assert(buffer->empty(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   572
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   573
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   574
static void reset_thread_local_buffer() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   575
  reset_buffer(thread_local_buffer());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   576
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   577
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   578
static void write_thread_local_buffer(JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   579
  JfrBuffer * const buffer = thread_local_buffer();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   580
  assert(buffer != NULL, "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   581
  if (!buffer->empty()) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   582
    chunkwriter.write_unbuffered(buffer->top(), buffer->pos() - buffer->top());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   583
    reset_buffer(buffer);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   584
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   585
  assert(buffer->empty(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   586
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   587
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   588
typedef ServiceFunctor<EventFlushStorage, JfrStorage, &JfrStorage::write> FlushStorageFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   589
typedef WriteSubsystem<FlushStorageFunctor> FlushStorage;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   590
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   591
static size_t flush_storage(JfrStorage& storage, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   592
  assert(chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   593
  FlushStorageFunctor fsf(storage);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   594
  FlushStorage fs(chunkwriter, fsf);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   595
  return invoke_with_flush_event(fs);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   596
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   597
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   598
typedef ServiceFunctor<EventFlush, JfrRecorderService, &JfrRecorderService::flush> FlushFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   599
typedef WriteSubsystem<FlushFunctor> Flush;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   600
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   601
static bool write_metadata_in_flushpoint = false;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   602
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   603
size_t JfrRecorderService::flush() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   604
  size_t total_elements = 0;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   605
  if (write_metadata_in_flushpoint) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   606
    total_elements = flush_metadata_event(_chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   607
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   608
  const size_t storage_elements = flush_storage(_storage, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   609
  if (0 == storage_elements) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   610
    return total_elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   611
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   612
  total_elements += storage_elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   613
  total_elements += flush_stacktrace(_stack_trace_repository, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   614
  if (_string_pool.modified()) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   615
    total_elements += flush_stringpool(_string_pool, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   616
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   617
  total_elements += flush_typeset(_checkpoint_manager, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   618
  return total_elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   619
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   620
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   621
void JfrRecorderService::flush(int msgs) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   622
  assert(_chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   623
  ResourceMark rm;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   624
  HandleMark hm;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   625
  reset_thread_local_buffer();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   626
  ++flushpoint_id;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   627
  write_metadata_in_flushpoint = (msgs & MSGBIT(MSG_FLUSHPOINT_METADATA));
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   628
  FlushFunctor flushpoint(*this);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   629
  Flush fl(_chunkwriter, flushpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   630
  invoke_with_flush_event(fl);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   631
  write_thread_local_buffer(_chunkwriter);
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   632
  _checkpoint_manager.flush();
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   633
  _repository.flush_chunk();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   634
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   635
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   636
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   637
// pre-safepoint write sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   638
//
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   639
//  write stack trace checkpoint ->
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   640
//    write string pool checkpoint ->
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   641
//      notify about pending rotation ->
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   642
//        write storage
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   643
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   644
void JfrRecorderService::pre_safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   645
  assert(_chunkwriter.is_valid(), "invariant");
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   646
  flush_stacktrace_checkpoint(_stack_trace_repository, _chunkwriter, false);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   647
  if (_string_pool.modified()) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   648
    flush_stringpool_checkpoint(_string_pool, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   649
  }
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   650
  if (LeakProfiler::is_running()) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   651
    // Exclusive access to the object sampler instance.
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   652
    // The sampler is released (unlocked) later in post_safepoint_write.
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   653
    ObjectSampleCheckpoint::rotate(ObjectSampler::acquire(), _stack_trace_repository);
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   654
  }
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   655
  _checkpoint_manager.notify_types_on_rotation();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   656
  _storage.write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   657
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   658
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   659
void JfrRecorderService::invoke_safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   660
  JfrVMOperation<JfrRecorderService, &JfrRecorderService::safepoint_write> safepoint_task(*this);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   661
  VMThread::execute(&safepoint_task);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   662
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   663
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   664
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   665
// safepoint write sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   666
//
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   667
// write object sample stacktraces ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   668
//   write stacktrace repository ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   669
//     write string pool ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   670
//       write storage ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   671
//         notify java threads ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   672
//           shift_epoch ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   673
//             update time
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   674
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   675
void JfrRecorderService::safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   676
  assert(SafepointSynchronize::is_at_safepoint(), "invariant");
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   677
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   678
  flush_stacktrace_checkpoint(_stack_trace_repository, _chunkwriter, true);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   679
  if (_string_pool.modified()) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   680
    flush_stringpool_checkpoint_safepoint(_string_pool, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   681
  }
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   682
  if (LeakProfiler::is_running()) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   683
    ObjectSampleCheckpoint::resolve_sampled_objects();
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   684
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   685
  _storage.write_at_safepoint();
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   686
  _checkpoint_manager.notify_threads();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   687
  _checkpoint_manager.shift_epoch();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   688
  _chunkwriter.time_stamp_chunk_now();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   689
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   690
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   691
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   692
// post-safepoint write sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   693
//
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   694
//  write type set ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   695
//    write checkpoints ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   696
//      write metadata event ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   697
//        close chunk
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   698
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   699
void JfrRecorderService::post_safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   700
  assert(_chunkwriter.is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   701
  // During the safepoint tasks just completed, the system transitioned to a new epoch.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   702
  // Type tagging is epoch relative which entails we are able to write out the
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   703
  // already tagged artifacts for the previous epoch. We can accomplish this concurrently
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   704
  // with threads now tagging artifacts in relation to the new, now updated, epoch and remain outside of a safepoint.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   705
  _checkpoint_manager.write_type_set();
57870
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   706
  if (LeakProfiler::is_running()) {
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   707
    // The object sampler instance was exclusively acquired and locked in pre_safepoint_write.
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   708
    // Note: There is a dependency on write_type_set() above, ensure the release is subsequent.
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   709
    ObjectSampler::release();
00860d9caf4d New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
mgronlun
parents: 57360
diff changeset
   710
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   711
  // serialize any outstanding checkpoint memory
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   712
  _checkpoint_manager.write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   713
  // serialize the metadata descriptor event and close out the chunk
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   714
  flush_metadata_event_checkpoint(_chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   715
  _repository.close_chunk();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   716
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   717
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   718
void JfrRecorderService::vm_error_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   719
  if (_chunkwriter.is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   720
    finalize_current_chunk_on_vm_error();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   721
    assert(!_chunkwriter.is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   722
    _repository.on_vm_error();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   723
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   724
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   725
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   726
void JfrRecorderService::finalize_current_chunk_on_vm_error() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   727
  assert(_chunkwriter.is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   728
  pre_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   729
  // Do not attempt safepoint dependent operations during emergency dump.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   730
  // Optimistically write tagged artifacts.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   731
  _checkpoint_manager.shift_epoch();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   732
  // update time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   733
  _chunkwriter.time_stamp_chunk_now();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   734
  post_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   735
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   736
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   737
void JfrRecorderService::process_full_buffers() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   738
  if (_chunkwriter.is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   739
    _storage.write_full();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   740
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   741
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   742
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   743
void JfrRecorderService::scavenge() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   744
  _storage.scavenge();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   745
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   746
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   747
void JfrRecorderService::evaluate_chunk_size_for_rotation() {
53014
339d2fbe8675 8215284: Reduce noise induced by periodic task getFileSize()
mgronlun
parents: 52877
diff changeset
   748
  JfrChunkRotation::evaluate(_chunkwriter);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   749
}