src/hotspot/share/jfr/recorder/checkpoint/types/traceid/jfrTraceId.cpp
author mgronlun
Sun, 15 Sep 2019 20:23:40 +0200
branchJEP-349-branch
changeset 58159 892527a70da9
parent 57870 00860d9caf4d
child 58164 1343c01b29d5
permissions -rw-r--r--
remove assymetric load_acquires
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"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
#include "runtime/vm_version.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include "runtime/jniHandles.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
#include "utilities/debug.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
 // returns updated value
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
static traceid atomic_inc(traceid volatile* const dest) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
  assert(VM_Version::supports_cx8(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
  traceid compare_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
  traceid exchange_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
  do {
58159
892527a70da9 remove assymetric load_acquires
mgronlun
parents: 57870
diff changeset
    47
    compare_value = Atomic::load(dest);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
    exchange_value = compare_value + 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  return exchange_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
static traceid next_class_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  static volatile traceid class_id_counter = MaxJfrEventId + 100;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
  return atomic_inc(&class_id_counter) << TRACE_ID_SHIFT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
static traceid next_thread_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  static volatile traceid thread_id_counter = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
  return atomic_inc(&thread_id_counter);
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
static traceid next_module_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
  static volatile traceid module_id_counter = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
  return atomic_inc(&module_id_counter) << TRACE_ID_SHIFT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
static traceid next_package_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
  static volatile traceid package_id_counter = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
  return atomic_inc(&package_id_counter) << TRACE_ID_SHIFT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
static traceid next_class_loader_data_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
  static volatile traceid cld_id_counter = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
  return atomic_inc(&cld_id_counter) << TRACE_ID_SHIFT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    78
static bool found_jdk_internal_event_klass = false;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
static bool found_jdk_jfr_event_klass = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
static void check_klass(const Klass* klass) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
  assert(klass != NULL, "invariant");
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    83
  if (found_jdk_internal_event_klass && found_jdk_jfr_event_klass) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
  }
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    86
  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
    87
  if (jdk_internal_event_sym == NULL) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    88
    // 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
    89
    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
    90
  }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
    91
  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
    92
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
  static const Symbol* jdk_jfr_event_sym = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  if (jdk_jfr_event_sym == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
    // 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
    96
    jdk_jfr_event_sym = SymbolTable::new_permanent_symbol("jdk/jfr/Event");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
  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
    99
  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
   100
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   101
  if (!found_jdk_internal_event_klass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   102
    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
   103
      found_jdk_internal_event_klass = true;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   104
      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
   105
      return;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   106
    }
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
  if (!found_jdk_jfr_event_klass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   110
    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
   111
      found_jdk_jfr_event_klass = true;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   112
      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
   113
      return;
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 51444
diff changeset
   114
    }
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
void JfrTraceId::assign(const Klass* klass) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
  assert(klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
  klass->set_trace_id(next_class_id());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  check_klass(klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
  const Klass* const super = klass->super();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
  if (super == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
  if (IS_EVENT_KLASS(super)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
    tag_as_jdk_jfr_event_sub(klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
  }
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
void JfrTraceId::assign(const ModuleEntry* module) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
  assert(module != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
  module->set_trace_id(next_module_id());
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
void JfrTraceId::assign(const PackageEntry* package) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
  assert(package != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
  package->set_trace_id(next_package_id());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
void JfrTraceId::assign(const ClassLoaderData* cld) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  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
   143
  if (cld->is_unsafe_anonymous()) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
    cld->set_trace_id(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
  cld->set_trace_id(next_class_loader_data_id());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
traceid JfrTraceId::assign_thread_id() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
  return next_thread_id();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
// used by CDS / APPCDS as part of "remove_unshareable_info"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
void JfrTraceId::remove(const Klass* k) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
  assert(k != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
  // Mask off and store the event flags.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  // This mechanism will retain the event specific flags
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
  // in the archive, allowing for event flag restoration
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
  // 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
   161
  k->set_trace_id(EVENT_KLASS_MASK(k));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
// used by CDS / APPCDS as part of "restore_unshareable_info"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
void JfrTraceId::restore(const Klass* k) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  assert(k != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
  if (IS_JDK_JFR_EVENT_KLASS(k)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
    found_jdk_jfr_event_klass = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
  const traceid event_flags = k->trace_id();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
  // get a fresh traceid and restore the original event flags
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
  k->set_trace_id(next_class_id() | event_flags);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
traceid JfrTraceId::get(jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_vm, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  const oop my_oop = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  assert(my_oop != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  return get(java_lang_Class::as_Klass(my_oop));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
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
   183
traceid JfrTraceId::use(jclass jc) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
  assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_vm, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
  const oop my_oop = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
  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
   188
  return use(java_lang_Class::as_Klass(my_oop));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
bool JfrTraceId::in_visible_set(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_vm, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
  return in_visible_set(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
bool JfrTraceId::in_jdk_jfr_event_hierarchy(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
  return in_jdk_jfr_event_hierarchy(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
bool JfrTraceId::is_jdk_jfr_event_sub(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  return is_jdk_jfr_event_sub(java_lang_Class::as_Klass(mirror));
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
bool JfrTraceId::is_jdk_jfr_event(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
  return is_jdk_jfr_event(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
bool JfrTraceId::is_event_host(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
  return is_event_host(java_lang_Class::as_Klass(mirror));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
void JfrTraceId::tag_as_jdk_jfr_event_sub(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
  const Klass* const k = java_lang_Class::as_Klass(mirror);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
  tag_as_jdk_jfr_event_sub(k);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
  assert(IS_JDK_JFR_EVENT_SUBKLASS(k), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
void JfrTraceId::tag_as_event_host(const jclass jc) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
  assert(jc != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  const oop mirror = JNIHandles::resolve(jc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
  assert(mirror != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
  const Klass* const k = java_lang_Class::as_Klass(mirror);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
  tag_as_event_host(k);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
  assert(IS_EVENT_HOST_KLASS(k), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
}