src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp
author mgronlun
Sun, 25 Aug 2019 15:13:16 +0200
branchJEP-349-branch
changeset 57873 68134337dbf8
parent 57872 7aa1b3d6ff8f
child 57882 562f598d303c
permissions -rw-r--r--
typeset serialization cache
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
57360
5d043a159d5c Preview
egahlin
parents: 52212
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"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
#include "classfile/javaClasses.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "jfr/recorder/jfrRecorder.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
#include "jfr/recorder/checkpoint/types/jfrTypeManager.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include "jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include "jfr/recorder/service/jfrOptionSet.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
#include "jfr/recorder/storage/jfrMemorySpace.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
#include "jfr/recorder/storage/jfrStorageUtils.inline.hpp"
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/utilities/jfrBigEndian.hpp"
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
    37
#include "jfr/utilities/jfrIterator.hpp"
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
    38
#include "jfr/utilities/jfrThreadIterator.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
#include "jfr/utilities/jfrTypes.hpp"
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
    40
#include "jfr/writers/jfrJavaEventWriter.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
#include "logging/log.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
#include "memory/resourceArea.hpp"
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
    43
#include "runtime/handles.inline.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
#include "runtime/mutexLocker.hpp"
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 50117
diff changeset
    45
#include "runtime/orderAccess.hpp"
50117
fb66b2959eaf 8203251: Non-PCH build failed after JDK-8199712 (Flight Recorder)
shade
parents: 50113
diff changeset
    46
#include "runtime/os.inline.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
#include "runtime/safepoint.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
typedef JfrCheckpointManager::Buffer* BufferPtr;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
static JfrCheckpointManager* _instance = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
JfrCheckpointManager& JfrCheckpointManager::instance() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  return *_instance;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
JfrCheckpointManager* JfrCheckpointManager::create(JfrChunkWriter& cw) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
  assert(_instance == NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  _instance = new JfrCheckpointManager(cw);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
  return _instance;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
void JfrCheckpointManager::destroy() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
  assert(_instance != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
  delete _instance;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
  _instance = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
JfrCheckpointManager::JfrCheckpointManager(JfrChunkWriter& cw) :
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
  _free_list_mspace(NULL),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
  _epoch_transition_mspace(NULL),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
  _lock(NULL),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
  _service_thread(NULL),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
  _chunkwriter(cw),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
  _checkpoint_epoch_state(JfrTraceIdEpoch::epoch()) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
JfrCheckpointManager::~JfrCheckpointManager() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
  if (_free_list_mspace != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
    delete _free_list_mspace;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
  if (_epoch_transition_mspace != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
    delete _epoch_transition_mspace;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
  if (_lock != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
    delete _lock;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
  }
50703
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
    87
  JfrTypeManager::clear();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
static const size_t unlimited_mspace_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
static const size_t checkpoint_buffer_cache_count = 2;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
static const size_t checkpoint_buffer_size = 512 * K;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
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
    94
static JfrCheckpointMspace* allocate_mspace(size_t size, size_t limit, size_t cache_count, JfrCheckpointManager* mgr) {
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
    95
  return create_mspace<JfrCheckpointMspace, JfrCheckpointManager>(size, limit, cache_count, mgr);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
bool JfrCheckpointManager::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  assert(_free_list_mspace == NULL, "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
   100
  _free_list_mspace = allocate_mspace(checkpoint_buffer_size, unlimited_mspace_size, checkpoint_buffer_cache_count, this);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
  if (_free_list_mspace == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
  assert(_epoch_transition_mspace == NULL, "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
   105
  _epoch_transition_mspace = allocate_mspace(checkpoint_buffer_size, unlimited_mspace_size, checkpoint_buffer_cache_count, this);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
  if (_epoch_transition_mspace == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
  }
50703
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   109
  assert(_lock == NULL, "invariant");
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   110
  _lock = new Mutex(Monitor::leaf - 1, "Checkpoint mutex", Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never);
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   111
  if (_lock == NULL) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
  }
50703
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   114
  return JfrTypeManager::initialize();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
void JfrCheckpointManager::register_service_thread(const Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
  _service_thread = thread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
void JfrCheckpointManager::register_full(BufferPtr t, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
  // nothing here at the moment
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   123
  assert(t != NULL, "invariant");
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   124
  assert(t->acquired_by(thread), "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
  assert(t->retired(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
void JfrCheckpointManager::lock() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
  assert(!_lock->owned_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
  _lock->lock_without_safepoint_check();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
void JfrCheckpointManager::unlock() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  _lock->unlock();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
#ifdef ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
bool JfrCheckpointManager::is_locked() const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
  return _lock->owned_by_self();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
static void assert_free_lease(const BufferPtr buffer) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
  assert(buffer != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
  assert(buffer->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
  assert(buffer->lease(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
static void assert_release(const BufferPtr buffer) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
  assert(buffer != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
  assert(buffer->lease(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
  assert(buffer->acquired_by_self(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
#endif // ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
static BufferPtr lease_free(size_t size, JfrCheckpointMspace* mspace, size_t retry_count, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
  static const size_t max_elem_size = mspace->min_elem_size(); // min is max
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
  BufferPtr buffer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  if (size <= max_elem_size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
    BufferPtr buffer = mspace_get_free_lease_with_retry(size, mspace, retry_count, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
    if (buffer != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
      DEBUG_ONLY(assert_free_lease(buffer);)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
      return buffer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
  buffer = mspace_allocate_transient_lease_to_free(size, mspace, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  DEBUG_ONLY(assert_free_lease(buffer);)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
  return buffer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
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
   170
bool JfrCheckpointManager::use_epoch_transition_mspace(const Thread* thread) const {
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
   171
  return _service_thread != thread && OrderAccess::load_acquire(&_checkpoint_epoch_state) != JfrTraceIdEpoch::epoch();
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
   172
}
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
   173
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
static const size_t lease_retry = 10;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
BufferPtr JfrCheckpointManager::lease_buffer(Thread* thread, size_t size /* 0 */) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  JfrCheckpointManager& manager = instance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  if (manager.use_epoch_transition_mspace(thread)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
    return lease_free(size, manager._epoch_transition_mspace, lease_retry, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
  return lease_free(size, manager._free_list_mspace, lease_retry, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
* If the buffer was a "lease" from the free list, release back.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
* The buffer is effectively invalidated for the thread post-return,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
* and the caller should take means to ensure that it is not referenced.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
static void release(BufferPtr const buffer, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
  DEBUG_ONLY(assert_release(buffer);)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  buffer->clear_lease();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  buffer->release();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
BufferPtr JfrCheckpointManager::flush(BufferPtr old, size_t used, size_t requested, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
  assert(old != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
  assert(old->lease(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
  if (0 == requested) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    // indicates a lease is being returned
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    release(old, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
  // migration of in-flight information
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
  BufferPtr const new_buffer = lease_buffer(thread, used + requested);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
  if (new_buffer != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
    migrate_outstanding_writes(old, new_buffer, used, requested);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  release(old, thread);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  return new_buffer; // might be NULL
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
// offsets into the JfrCheckpointEntry
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
static const juint starttime_offset = sizeof(jlong);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
static const juint duration_offset = starttime_offset + sizeof(jlong);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
static const juint flushpoint_offset = duration_offset + sizeof(jlong);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
static const juint types_offset = flushpoint_offset + sizeof(juint);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
static const juint payload_offset = types_offset + sizeof(juint);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
template <typename Return>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
static Return read_data(const u1* data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
  return JfrBigEndian::read<Return>(data);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
static jlong total_size(const u1* data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
  return read_data<jlong>(data);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
static jlong starttime(const u1* data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
  return read_data<jlong>(data + starttime_offset);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
static jlong duration(const u1* data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
  return read_data<jlong>(data + duration_offset);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
static juint number_of_types(const u1* data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  return read_data<juint>(data + types_offset);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
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
   241
static void write_checkpoint_header(JfrChunkWriter& cw, int64_t offset_prev_cp_event, const u1* data) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
  cw.reserve(sizeof(u4));
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
   243
  cw.write<u8>(EVENT_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
   244
  cw.write<u8>(starttime(data));
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
   245
  cw.write<u8>(duration(data));
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
   246
  cw.write<u8>(offset_prev_cp_event);
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
   247
  cw.write<bool>(false); // not a flushpoint
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
   248
  cw.write<juint>(number_of_types(data));
50113
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
static void write_checkpoint_content(JfrChunkWriter& cw, const u1* data, size_t size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
  assert(data != NULL, "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
   253
  cw.write_unbuffered(data + payload_offset, size - sizeof(JfrCheckpointEntry));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
static size_t write_checkpoint_event(JfrChunkWriter& cw, const u1* data) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
  assert(data != NULL, "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
   258
  const int64_t event_begin = cw.current_offset();
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   259
  const int64_t last_checkpoint_event = cw.last_checkpoint_offset();
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
   260
  const int64_t delta = last_checkpoint_event == 0 ? 0 : last_checkpoint_event - event_begin;
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
   261
  const int64_t checkpoint_size = total_size(data);
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
   262
  write_checkpoint_header(cw, delta, data);
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
   263
  write_checkpoint_content(cw, data, checkpoint_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
   264
  const int64_t event_size = cw.current_offset() - event_begin;
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
   265
  cw.write_padded_at_offset<u4>(event_size, event_begin);
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   266
  cw.set_last_checkpoint_offset(event_begin);
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
   267
  return (size_t)checkpoint_size;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
static size_t write_checkpoints(JfrChunkWriter& cw, const u1* data, size_t size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
  assert(cw.is_valid(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
  assert(data != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
  assert(size > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
  const u1* const limit = data + size;
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
   275
  const u1* next = data;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
  size_t processed = 0;
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
   277
  while (next < limit) {
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
    const size_t checkpoint_size = write_checkpoint_event(cw, next);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
    processed += checkpoint_size;
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
   280
    next += checkpoint_size;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
  }
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
   282
  assert(next == limit, "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
  return processed;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
template <typename T>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
class CheckpointWriteOp {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
  JfrChunkWriter& _writer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
  size_t _processed;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
 public:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
  typedef T Type;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
  CheckpointWriteOp(JfrChunkWriter& writer) : _writer(writer), _processed(0) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
  bool write(Type* t, const u1* data, size_t size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    _processed += write_checkpoints(_writer, data, size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
  size_t processed() const { return _processed; }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
typedef CheckpointWriteOp<JfrCheckpointMspace::Type> WriteOperation;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
typedef ReleaseOp<JfrCheckpointMspace> CheckpointReleaseOperation;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
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
   304
template <template <typename> class WriterHost, template <typename, typename> class CompositeOperation>
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
   305
static size_t write_mspace(JfrCheckpointMspace* mspace, JfrChunkWriter& chunkwriter) {
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
   306
  assert(mspace != NULL, "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
  WriteOperation wo(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
   308
  WriterHost<WriteOperation> wh(wo);
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
   309
  CheckpointReleaseOperation cro(mspace, Thread::current(), false);
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
   310
  CompositeOperation<WriterHost<WriteOperation>, CheckpointReleaseOperation> co(&wh, &cro);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
  assert(mspace->is_full_empty(), "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
   312
  process_free_list(co, mspace);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
  return wo.processed();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
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
   316
void JfrCheckpointManager::synchronize_epoch() {
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
   317
  assert(_checkpoint_epoch_state != JfrTraceIdEpoch::epoch(), "invariant");
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
   318
  OrderAccess::storestore();
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
   319
  _checkpoint_epoch_state = JfrTraceIdEpoch::epoch();
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   320
}
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   321
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
   322
void JfrCheckpointManager::shift_epoch() {
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
   323
  debug_only(const u1 current_epoch = JfrTraceIdEpoch::current();)
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
   324
  JfrTraceIdEpoch::shift_epoch();
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
   325
  assert(current_epoch != JfrTraceIdEpoch::current(), "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
typedef DiscardOp<DefaultDiscarder<JfrBuffer> > DiscardOperation;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
size_t JfrCheckpointManager::clear() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
  DiscardOperation discarder(mutexed); // mutexed discard mode
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
  process_free_list(discarder, _free_list_mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
  process_free_list(discarder, _epoch_transition_mspace);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
  synchronize_epoch();
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   334
  return discarder.elements();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
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
   337
size_t JfrCheckpointManager::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
   338
  const size_t processed = write_mspace<MutexedWriteOp, CompositeOperation>(_free_list_mspace, _chunkwriter);
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
   339
  synchronize_epoch();
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
   340
  return processed;
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
   341
}
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
   342
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
   343
typedef MutexedWriteOp<WriteOperation> FlushOperation;
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
   344
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
   345
size_t JfrCheckpointManager::flush() {
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
   346
  WriteOperation wo(_chunkwriter);
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
   347
  FlushOperation fo(wo);
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
   348
  assert(_free_list_mspace->is_full_empty(), "invariant");
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
   349
  process_free_list(fo, _free_list_mspace);
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
   350
  return wo.processed();
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
   351
}
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
   352
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
size_t JfrCheckpointManager::write_types() {
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   354
  ResourceMark rm;
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   355
  HandleMark hm;
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
   356
  Thread* const t = Thread::current();
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
   357
  // Optimization here is to write the types directly into the epoch transition mspace
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
   358
  // because the caller will immediately serialize and reset this mspace.
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
   359
  JfrBuffer* const buffer = _epoch_transition_mspace->free_tail();
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
   360
  assert(buffer != NULL, "invariant");
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
   361
  buffer->acquire(t);
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
   362
  buffer->set_lease();
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
   363
  DEBUG_ONLY(assert_free_lease(buffer);)
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
   364
  JfrCheckpointWriter writer(t, buffer);
50703
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   365
  JfrTypeManager::write_types(writer);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
  return writer.used_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
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
   369
size_t JfrCheckpointManager::write_epoch_transition_mspace() {
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
   370
  return write_mspace<ExclusiveOp, CompositeOperation>(_epoch_transition_mspace, _chunkwriter);
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
   371
}
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
   372
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
   373
size_t JfrCheckpointManager::write_constants() {
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
   374
  write_types();
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
   375
  return write_epoch_transition_mspace();
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
   376
}
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
   377
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   378
class JfrNotifyClosure : public ThreadClosure {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   379
 public:
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   380
  void do_thread(Thread* t) {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   381
    assert(t != NULL, "invariant");
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   382
    assert(t->is_Java_thread(), "invariant");
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   383
    assert_locked_or_safepoint(Threads_lock);
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   384
    JfrJavaEventWriter::notify((JavaThread*)t);
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   385
  }
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   386
};
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   387
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   388
void JfrCheckpointManager::notify_threads() {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   389
  assert(SafepointSynchronize::is_at_safepoint(), "invariant");
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   390
  JfrNotifyClosure tc;
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   391
  JfrJavaThreadIterator iter;
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   392
  while (iter.has_next()) {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   393
    tc.do_thread(iter.next());
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   394
  }
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   395
}
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   396
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   397
void JfrCheckpointManager::notify_types_on_rotation() {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   398
  JfrTypeManager::notify_types_on_rotation();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
void JfrCheckpointManager::write_type_set() {
50703
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   402
  JfrTypeManager::write_type_set();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
void JfrCheckpointManager::write_type_set_for_unloaded_classes() {
52212
e6973df15152 8212663: Remove conservative at_safepoint assert when JFR writes type sets during class unloading
eosterlund
parents: 50703
diff changeset
   406
  assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
50703
0486d7749b8d 8205053: Decouple type registration from framework lifecycle
egahlin
parents: 50429
diff changeset
   407
  JfrTypeManager::write_type_set_for_unloaded_classes();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
57873
68134337dbf8 typeset serialization cache
mgronlun
parents: 57872
diff changeset
   410
bool JfrCheckpointManager::is_type_set_checkpoint_required() const {
68134337dbf8 typeset serialization cache
mgronlun
parents: 57872
diff changeset
   411
  return JfrTraceIdEpoch::is_klass_tagged_in_epoch();
68134337dbf8 typeset serialization cache
mgronlun
parents: 57872
diff changeset
   412
}
68134337dbf8 typeset serialization cache
mgronlun
parents: 57872
diff changeset
   413
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   414
size_t JfrCheckpointManager::flush_type_set() {
57872
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   415
  const size_t elements = JfrTypeManager::flush_type_set();
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   416
  flush();
7aa1b3d6ff8f stacktrace serialization cache
mgronlun
parents: 57870
diff changeset
   417
  return elements;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   420
void JfrCheckpointManager::create_thread_checkpoint(Thread* t) {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   421
  JfrTypeManager::create_thread_checkpoint(t);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
}
57360
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   423
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   424
void JfrCheckpointManager::write_thread_checkpoint(Thread* t) {
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   425
  JfrTypeManager::write_thread_checkpoint(t);
5d043a159d5c Preview
egahlin
parents: 52212
diff changeset
   426
}