src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceId.cpp
author mgronlun
Sat, 24 Aug 2019 14:30:27 +0200
branchJEP-349-branch
changeset 57870 00860d9caf4d
parent 54847 59ea39bb2809
child 58159 892527a70da9
child 58863 c16ac7a2eba4
permissions -rw-r--r--
New metadata system for oldobjects built on top of simplified tagging model. Caching and serialization improvements. Flushpoint checkpoint with chunkheader contents.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
54847
59ea39bb2809 8223657: Remove unused THREAD argument from SymbolTable functions
coleenp
parents: 52334
diff changeset
     2
 * Copyright (c) 2011, 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/classLoaderData.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "classfile/symbolTable.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "jfr/utilities/jfrTypes.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
#include "oops/arrayKlass.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include "oops/klass.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include "oops/instanceKlass.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
#include "oops/method.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
#include "oops/oop.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
#include "runtime/atomic.hpp"
50429
83aec1d357d4 8204301: Make OrderAccess functions available to hpp rather than inline.hpp files
coleenp
parents: 50113
diff changeset
    36
#include "runtime/orderAccess.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include "runtime/vm_version.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
#include "runtime/jniHandles.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
#include "utilities/debug.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
 // returns updated value
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
static traceid atomic_inc(traceid volatile* const dest) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
  assert(VM_Version::supports_cx8(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
  traceid compare_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
  traceid exchange_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
  do {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
    compare_value = OrderAccess::load_acquire(dest);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
    exchange_value = compare_value + 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  return exchange_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
static traceid next_class_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
  static volatile traceid class_id_counter = MaxJfrEventId + 100;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
  return atomic_inc(&class_id_counter) << TRACE_ID_SHIFT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
static traceid next_thread_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
  static volatile traceid thread_id_counter = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  return atomic_inc(&thread_id_counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
static traceid next_module_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
  static volatile traceid module_id_counter = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
  return atomic_inc(&module_id_counter) << TRACE_ID_SHIFT;
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
static traceid next_package_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
  static volatile traceid package_id_counter = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
  return atomic_inc(&package_id_counter) << TRACE_ID_SHIFT;
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
static traceid next_class_loader_data_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
  static volatile traceid cld_id_counter = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
  return atomic_inc(&cld_id_counter) << TRACE_ID_SHIFT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    79
static bool found_jdk_internal_event_klass = false;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
static bool found_jdk_jfr_event_klass = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
static void check_klass(const Klass* klass) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  assert(klass != NULL, "invariant");
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    84
  if (found_jdk_internal_event_klass && found_jdk_jfr_event_klass) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
  }
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    87
  static const Symbol* jdk_internal_event_sym = NULL;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    88
  if (jdk_internal_event_sym == NULL) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    89
    // setup when loading the first TypeArrayKlass (Universe::genesis) hence single threaded invariant
54847
59ea39bb2809 8223657: Remove unused THREAD argument from SymbolTable functions
coleenp
parents: 52334
diff changeset
    90
    jdk_internal_event_sym = SymbolTable::new_permanent_symbol("jdk/internal/event/Event");
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    91
  }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    92
  assert(jdk_internal_event_sym != NULL, "invariant");
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    93
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  static const Symbol* jdk_jfr_event_sym = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
  if (jdk_jfr_event_sym == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
    // setup when loading the first TypeArrayKlass (Universe::genesis) hence single threaded invariant
54847
59ea39bb2809 8223657: Remove unused THREAD argument from SymbolTable functions
coleenp
parents: 52334
diff changeset
    97
    jdk_jfr_event_sym = SymbolTable::new_permanent_symbol("jdk/jfr/Event");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  assert(jdk_jfr_event_sym != NULL, "invariant");
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   100
  const Symbol* const klass_name = klass->name();
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   101
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   102
  if (!found_jdk_internal_event_klass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   103
    if (jdk_internal_event_sym == klass_name && klass->class_loader() == NULL) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   104
      found_jdk_internal_event_klass = true;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   105
      JfrTraceId::tag_as_jdk_jfr_event(klass);
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   106
      return;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   107
    }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   108
  }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   109
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   110
  if (!found_jdk_jfr_event_klass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   111
    if (jdk_jfr_event_sym == klass_name && klass->class_loader() == NULL) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   112
      found_jdk_jfr_event_klass = true;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   113
      JfrTraceId::tag_as_jdk_jfr_event(klass);
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   114
      return;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   115
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
void JfrTraceId::assign(const Klass* klass) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
  assert(klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  klass->set_trace_id(next_class_id());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
  check_klass(klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
  const Klass* const super = klass->super();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
  if (super == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
  if (IS_EVENT_KLASS(super)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
    tag_as_jdk_jfr_event_sub(klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
void JfrTraceId::assign(const ModuleEntry* module) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
  assert(module != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  module->set_trace_id(next_module_id());
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
void JfrTraceId::assign(const PackageEntry* package) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
  assert(package != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
  package->set_trace_id(next_package_id());
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
void JfrTraceId::assign(const ClassLoaderData* cld) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
  assert(cld != NULL, "invariant");
51444
3e5d28e6de32 8209301: JVM rename is_anonymous, host_klass to unsafe specific terminology ahead of Unsafe.defineAnonymousClass deprecation
lfoltan
parents: 50429
diff changeset
   144
  if (cld->is_unsafe_anonymous()) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
    cld->set_trace_id(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
  cld->set_trace_id(next_class_loader_data_id());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
traceid JfrTraceId::assign_thread_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
  return next_thread_id();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
// used by CDS / APPCDS as part of "remove_unshareable_info"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
void JfrTraceId::remove(const Klass* k) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
  assert(k != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  // Mask off and store the event flags.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
  // This mechanism will retain the event specific flags
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
  // in the archive, allowing for event flag restoration
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
  // when renewing the traceid on klass revival.
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: 54847
diff changeset
   162
  k->set_trace_id(EVENT_KLASS_MASK(k));
50113
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
// used by CDS / APPCDS as part of "restore_unshareable_info"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
void JfrTraceId::restore(const Klass* k) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
  assert(k != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
  if (IS_JDK_JFR_EVENT_KLASS(k)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
    found_jdk_jfr_event_klass = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
  const traceid event_flags = k->trace_id();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
  // get a fresh traceid and restore the original event flags
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
  k->set_trace_id(next_class_id() | event_flags);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
traceid JfrTraceId::get(jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_vm, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  const oop my_oop = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  assert(my_oop != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
  return get(java_lang_Class::as_Klass(my_oop));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
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: 54847
diff changeset
   184
traceid JfrTraceId::use(jclass jc) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
  assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_vm, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
  const oop my_oop = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
  assert(my_oop != 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: 54847
diff changeset
   189
  return use(java_lang_Class::as_Klass(my_oop));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
bool JfrTraceId::in_visible_set(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
  assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_vm, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
  return in_visible_set(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
bool JfrTraceId::in_jdk_jfr_event_hierarchy(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
  return in_jdk_jfr_event_hierarchy(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
bool JfrTraceId::is_jdk_jfr_event_sub(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
  return is_jdk_jfr_event_sub(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
bool JfrTraceId::is_jdk_jfr_event(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
  return is_jdk_jfr_event(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
bool JfrTraceId::is_event_host(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
  return is_event_host(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
void JfrTraceId::tag_as_jdk_jfr_event_sub(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
  const Klass* const k = java_lang_Class::as_Klass(mirror);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
  tag_as_jdk_jfr_event_sub(k);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
  assert(IS_JDK_JFR_EVENT_SUBKLASS(k), "invariant");
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
void JfrTraceId::tag_as_event_host(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
  const Klass* const k = java_lang_Class::as_Klass(mirror);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
  tag_as_event_host(k);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  assert(IS_EVENT_HOST_KLASS(k), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
}