src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp
author mgronlun
Sun, 25 Aug 2019 13:27:54 +0200
branchJEP-349-branch
changeset 57872 7aa1b3d6ff8f
parent 57870 00860d9caf4d
child 57873 68134337dbf8
permissions -rw-r--r--
stacktrace serialization cache
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);
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   298
  write_flush_event(f);
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   299
  return elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   300
}
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
template <typename Instance, void(Instance::*func)()>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
class JfrVMOperation : public VM_Operation {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
  Instance& _instance;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
 public:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
  JfrVMOperation(Instance& instance) : _instance(instance) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
  void doit() { (_instance.*func)(); }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
  VMOp_Type type() const { return VMOp_JFRCheckpoint; }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
  Mode evaluation_mode() const { return _safepoint; } // default
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   313
class FlushStackTraceRepository : public StackObj {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
  JfrStackTraceRepository& _repo;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
  JfrChunkWriter& _cw;
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   317
  size_t _elements;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
  bool _clear;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
 public:
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   321
  typedef EventFlushStacktrace EventType;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   322
  FlushStackTraceRepository(JfrStackTraceRepository& repo, JfrChunkWriter& cw, bool clear) :
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   323
    _repo(repo), _cw(cw), _elements(0), _clear(clear) {}
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
  bool process() {
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   325
    _elements = _repo.write(_cw, _clear);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
  }
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   328
  size_t elements() const { return _elements; }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   329
  void reset() { _elements = 0; }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   330
};
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   331
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   332
class FlushMetadataEvent : public StackObj {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   333
 private:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   334
  JfrChunkWriter& _cw;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   335
 public:
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   336
  typedef EventFlushMetadata EventType;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   337
  FlushMetadataEvent(JfrChunkWriter& cw) : _cw(cw) {}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   338
  bool process() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   339
    JfrMetadataEvent::write(_cw);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   340
    return true;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   341
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   342
  size_t elements() const { return 1; }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
static bool recording = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
static void set_recording_state(bool is_recording) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
  OrderAccess::storestore();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
  recording = is_recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
bool JfrRecorderService::is_recording() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
  return recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
JfrRecorderService::JfrRecorderService() :
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
  _checkpoint_manager(JfrCheckpointManager::instance()),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
  _chunkwriter(JfrRepository::chunkwriter()),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
  _repository(JfrRepository::instance()),
51334
cc2c79d22508 8208671: Runtime, JFR, Serviceability changes to allow enabling -Wreorder
tschatzl
parents: 50429
diff changeset
   360
  _stack_trace_repository(JfrStackTraceRepository::instance()),
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
  _storage(JfrStorage::instance()),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
  _string_pool(JfrStringPool::instance()) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
void JfrRecorderService::start() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
  RotationLock rl(Thread::current());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
  if (rl.not_acquired()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
  log_debug(jfr, system)("Request to START recording");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
  assert(!is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
  clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
  set_recording_state(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
  assert(is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
  open_new_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
  log_debug(jfr, system)("Recording STARTED");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
void JfrRecorderService::clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
  ResourceMark rm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
  HandleMark hm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
  pre_safepoint_clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
  invoke_safepoint_clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
  post_safepoint_clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
void JfrRecorderService::pre_safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
  _stack_trace_repository.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
  _string_pool.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
  _storage.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
void JfrRecorderService::invoke_safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
  JfrVMOperation<JfrRecorderService, &JfrRecorderService::safepoint_clear> safepoint_task(*this);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
  VMThread::execute(&safepoint_task);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
// safepoint clear sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
//  clear stacktrace repository ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
//    clear string pool ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
//      clear storage ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
//        shift epoch ->
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
//          update time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
void JfrRecorderService::safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
  assert(SafepointSynchronize::is_at_safepoint(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
  _stack_trace_repository.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
  _string_pool.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
  _storage.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
  _checkpoint_manager.shift_epoch();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
  _chunkwriter.time_stamp_chunk_now();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
void JfrRecorderService::post_safepoint_clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
  _checkpoint_manager.clear();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
static void stop() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
  assert(JfrRecorderService::is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
  log_debug(jfr, system)("Recording STOPPED");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
  set_recording_state(false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
  assert(!JfrRecorderService::is_recording(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
void JfrRecorderService::rotate(int msgs) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
  RotationLock rl(Thread::current());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
  if (rl.not_acquired()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
  static bool vm_error = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
  if (msgs & MSGBIT(MSG_VM_ERROR)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
    vm_error = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
    prepare_for_vm_error_rotation();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
  }
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
   436
  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
   437
    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
   438
  } 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
   439
    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
   440
  } 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
   441
    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
   442
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   443
  if (msgs & (MSGBIT(MSG_STOP))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   444
    stop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   445
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   446
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   447
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   448
void JfrRecorderService::prepare_for_vm_error_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   449
  if (!_chunkwriter.is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
    open_new_chunk(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   452
  _checkpoint_manager.register_service_thread(Thread::current());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   453
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   454
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   455
void JfrRecorderService::open_new_chunk(bool vm_error) {
53014
339d2fbe8675 8215284: Reduce noise induced by periodic task getFileSize()
mgronlun
parents: 52877
diff changeset
   456
  JfrChunkRotation::on_rotation();
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   457
  const bool valid_chunk = _repository.open_chunk(vm_error);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   458
  _storage.control().set_to_disk(valid_chunk);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   459
  if (valid_chunk) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   460
    _checkpoint_manager.write_constants();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   461
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   462
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   463
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   464
void JfrRecorderService::in_memory_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   465
  // currently running an in-memory recording
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   466
  assert(!_storage.control().to_disk(), "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   467
  open_new_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   468
  if (_chunkwriter.is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   469
    // dump all in-memory buffer data to the newly created chunk
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   470
    serialize_storage_from_in_memory_recording();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   471
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   472
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   473
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   474
void JfrRecorderService::serialize_storage_from_in_memory_recording() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   475
  _storage.write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   476
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   477
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   478
void JfrRecorderService::chunk_rotation() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   479
  finalize_current_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   480
  open_new_chunk();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   481
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   482
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   483
void JfrRecorderService::finalize_current_chunk() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   484
  assert(_chunkwriter.is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   485
  write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   486
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   487
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   488
void JfrRecorderService::write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   489
  ResourceMark rm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   490
  HandleMark hm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   491
  pre_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   492
  invoke_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   493
  post_safepoint_write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   494
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   495
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   496
typedef ServiceFunctor<EventFlushStringPool, JfrStringPool, &JfrStringPool::write> FlushStringPoolFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   497
typedef ServiceFunctor<EventFlushStringPool, JfrStringPool, &JfrStringPool::write_at_safepoint> FlushStringPoolSafepointFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   498
typedef WriteSubsystemCheckpointEvent<FlushStackTraceRepository> FlushStackTraceCheckpoint;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   499
typedef WriteSubsystemCheckpointEvent<FlushStringPoolFunctor> FlushStringPoolCheckpoint;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   500
typedef WriteSubsystemCheckpointEvent<FlushStringPoolSafepointFunctor> FlushStringPoolCheckpointSafepoint;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   501
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   502
static u4 flush_stacktrace(JfrStackTraceRepository& stack_trace_repo, JfrChunkWriter& chunkwriter, bool clear) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   503
  FlushStackTraceRepository flush_stacktrace_repo(stack_trace_repo, chunkwriter, clear);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   504
  FlushStackTraceCheckpoint flush_stack_trace_checkpoint(chunkwriter, flush_stacktrace_repo, TYPE_STACKTRACE);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   505
  return invoke_with_flush_event(flush_stack_trace_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   506
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   507
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   508
static u4 flush_stacktrace(JfrStackTraceRepository& stack_trace_repo, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   509
  return flush_stacktrace(stack_trace_repo, chunkwriter, false);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   510
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   511
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   512
static u4 flush_stacktrace_checkpoint(JfrStackTraceRepository& stack_trace_repo, JfrChunkWriter& chunkwriter, bool clear) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   513
  FlushStackTraceRepository flush_stacktrace_repo(stack_trace_repo, chunkwriter, clear);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   514
  FlushStackTraceCheckpoint flush_stack_trace_checkpoint(chunkwriter, flush_stacktrace_repo, TYPE_STACKTRACE);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   515
  return invoke(flush_stack_trace_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   516
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   517
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   518
static u4 flush_stringpool(JfrStringPool& string_pool, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   519
  FlushStringPoolFunctor flush_string_pool(string_pool);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   520
  FlushStringPoolCheckpoint flush_string_pool_checkpoint(chunkwriter, flush_string_pool, TYPE_STRING);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   521
  return invoke_with_flush_event(flush_string_pool_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   522
}
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   523
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   524
static u4 flush_stringpool_checkpoint(JfrStringPool& string_pool, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   525
  FlushStringPoolFunctor flush_string_pool(string_pool);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   526
  FlushStringPoolCheckpoint flush_string_pool_checkpoint(chunkwriter, flush_string_pool, TYPE_STRING);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   527
  return invoke(flush_string_pool_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   528
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   529
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   530
static u4 flush_stringpool_checkpoint_safepoint(JfrStringPool& string_pool, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   531
  FlushStringPoolSafepointFunctor flush_string_pool(string_pool);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   532
  FlushStringPoolCheckpointSafepoint flush_string_pool_checkpoint(chunkwriter, flush_string_pool, TYPE_STRING);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   533
  return invoke(flush_string_pool_checkpoint);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   534
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   535
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   536
typedef ServiceFunctor<EventFlushTypeSet, JfrCheckpointManager, &JfrCheckpointManager::flush_type_set> FlushTypeSetFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   537
typedef WriteSubsystem<FlushTypeSetFunctor> FlushTypeSet;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   538
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   539
static u4 flush_typeset(JfrCheckpointManager& checkpoint_manager, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   540
  FlushTypeSetFunctor flush_type_set(checkpoint_manager);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   541
  FlushTypeSet fts(chunkwriter, flush_type_set);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   542
  return invoke_with_flush_event(fts);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   543
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   544
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   545
typedef WriteSubsystem<FlushMetadataEvent> FlushMetadata;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   546
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   547
static u4 flush_metadata_event(JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   548
  assert(chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   549
  FlushMetadataEvent fme(chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   550
  FlushMetadata fm(chunkwriter, fme);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   551
  return invoke_with_flush_event(fm);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   552
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   553
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   554
static u4 flush_metadata_event_checkpoint(JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   555
  assert(chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   556
  FlushMetadataEvent wme(chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   557
  FlushMetadata wm(chunkwriter, wme);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   558
  return invoke(wm);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   559
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   560
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   561
static JfrBuffer* thread_local_buffer() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   562
  return Thread::current()->jfr_thread_local()->native_buffer();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   563
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   564
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   565
static void reset_buffer(JfrBuffer* buffer) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   566
  assert(buffer != NULL, "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   567
  assert(buffer == thread_local_buffer(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   568
  buffer->set_pos(const_cast<u1*>(buffer->top()));
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   569
  assert(buffer->empty(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   570
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   571
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   572
static void reset_thread_local_buffer() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   573
  reset_buffer(thread_local_buffer());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   574
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   575
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   576
static void write_thread_local_buffer(JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   577
  JfrBuffer * const buffer = thread_local_buffer();
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   578
  assert(buffer != NULL, "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   579
  if (!buffer->empty()) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   580
    chunkwriter.write_unbuffered(buffer->top(), buffer->pos() - buffer->top());
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   581
    reset_buffer(buffer);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   582
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   583
  assert(buffer->empty(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   584
}
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   585
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   586
typedef ServiceFunctor<EventFlushStorage, JfrStorage, &JfrStorage::write> FlushStorageFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   587
typedef WriteSubsystem<FlushStorageFunctor> FlushStorage;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   588
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   589
static size_t flush_storage(JfrStorage& storage, JfrChunkWriter& chunkwriter) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   590
  assert(chunkwriter.is_valid(), "invariant");
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   591
  FlushStorageFunctor fsf(storage);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   592
  FlushStorage fs(chunkwriter, fsf);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   593
  return invoke_with_flush_event(fs);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   594
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   595
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   596
typedef ServiceFunctor<EventFlush, JfrRecorderService, &JfrRecorderService::flush> FlushFunctor;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   597
typedef WriteSubsystem<FlushFunctor> Flush;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   598
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   599
static bool write_metadata_in_flushpoint = false;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   600
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   601
size_t JfrRecorderService::flush() {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   602
  size_t total_elements = 0;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   603
  if (write_metadata_in_flushpoint) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   604
    total_elements = flush_metadata_event(_chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   605
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   606
  const size_t storage_elements = flush_storage(_storage, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   607
  if (0 == storage_elements) {
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   608
    return total_elements;
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   609
  }
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   610
  total_elements += storage_elements;
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   611
  if (_stack_trace_repository.is_modified()) {
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   612
    total_elements += flush_stacktrace(_stack_trace_repository, _chunkwriter);
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   613
  }
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   614
  if (_string_pool.is_modified()) {
57360
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;
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   625
  write_metadata_in_flushpoint = (msgs & MSGBIT(MSG_FLUSHPOINT_METADATA));
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   626
  ++flushpoint_id;
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   627
  reset_thread_local_buffer();
57360
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);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   632
  _repository.flush_chunk();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   633
}
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
// pre-safepoint write sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   637
//
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
   638
//  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
   639
//    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
   640
//      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
   641
//        write storage
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   642
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   643
void JfrRecorderService::pre_safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   644
  assert(_chunkwriter.is_valid(), "invariant");
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   645
  if (_stack_trace_repository.is_modified()) {
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   646
    flush_stacktrace_checkpoint(_stack_trace_repository, _chunkwriter, false);
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   647
  }
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   648
  if (_string_pool.is_modified()) {
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   649
    flush_stringpool_checkpoint(_string_pool, _chunkwriter);
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   650
  }
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
   651
  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
   652
    // 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
   653
    // 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
   654
    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
   655
  }
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   656
  _checkpoint_manager.notify_types_on_rotation();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   657
  _storage.write();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   658
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   659
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   660
void JfrRecorderService::invoke_safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   661
  JfrVMOperation<JfrRecorderService, &JfrRecorderService::safepoint_write> safepoint_task(*this);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   662
  VMThread::execute(&safepoint_task);
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
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   666
// safepoint write sequence
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   667
//
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   668
// write object sample stacktraces ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   669
//   write stacktrace repository ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   670
//     write string pool ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   671
//       write storage ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   672
//         notify java threads ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   673
//           shift_epoch ->
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   674
//             update time
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   675
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   676
void JfrRecorderService::safepoint_write() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   677
  assert(SafepointSynchronize::is_at_safepoint(), "invariant");
57360
5d043a159d5c Preview
egahlin
parents: 54623
diff changeset
   678
  flush_stacktrace_checkpoint(_stack_trace_repository, _chunkwriter, true);
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   679
  if (_string_pool.is_modified()) {
57360
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
}