src/hotspot/share/jfr/jni/jfrGetAllEventClasses.cpp
author mgronlun
Mon, 25 Nov 2019 11:08:30 +0100
changeset 59244 6a897a8ef4af
parent 54847 59ea39bb2809
permissions -rw-r--r--
8234433: TestUnloadEventClassCount fails with "assert(SafepointSynchronize::is_at_safepoint()) failed: invariant" Reviewed-by: pliden
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: 52356
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 "classfile/symbolTable.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "jfr/jni/jfrGetAllEventClasses.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "jfr/jni/jfrJavaSupport.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
#include "jfr/support/jfrEventClass.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include "oops/instanceKlass.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include "memory/allocation.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
#include "memory/resourceArea.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
#include "runtime/handles.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
#include "runtime/mutexLocker.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include "utilities/growableArray.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
#include "utilities/stack.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
59244
6a897a8ef4af 8234433: TestUnloadEventClassCount fails with "assert(SafepointSynchronize::is_at_safepoint()) failed: invariant"
mgronlun
parents: 54847
diff changeset
    40
 // incremented during class unloading for each unloaded event class
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
static jlong unloaded_event_classes = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
jlong JfrEventClasses::unloaded_event_classes_count() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
  return unloaded_event_classes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
void JfrEventClasses::increment_unloaded_event_class() {
59244
6a897a8ef4af 8234433: TestUnloadEventClassCount fails with "assert(SafepointSynchronize::is_at_safepoint()) failed: invariant"
mgronlun
parents: 54847
diff changeset
    48
  assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  ++unloaded_event_classes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
static jobject empty_java_util_arraylist = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
static oop new_java_util_arraylist(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
  JavaValue result(T_OBJECT);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
  JfrJavaArguments args(&result, "java/util/ArrayList", "<init>", "()V", CHECK_NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
  JfrJavaSupport::new_object(&args, CHECK_NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  return (oop)result.get_jobject();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
static bool initialize(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
  static bool initialized = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
  if (!initialized) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
    unloaded_event_classes = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
    assert(NULL == empty_java_util_arraylist, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    const oop array_list = new_java_util_arraylist(CHECK_false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    empty_java_util_arraylist = JfrJavaSupport::global_jni_handle(array_list, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
    initialized = empty_java_util_arraylist != NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
  return initialized;
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
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
 * Abstract klasses are filtered out unconditionally.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
 * If a klass is not yet initialized, i.e yet to run its <clinit>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
 * it is also filtered out so we don't accidentally
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
 * trigger initialization.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
static bool is_whitelisted(const Klass* k) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
  assert(k != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
  return !(k->is_abstract() || k->should_be_initialized());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
static void fill_klasses(GrowableArray<const void*>& event_subklasses, const Klass* event_klass, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
  assert(event_subklasses.length() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
  assert(event_klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(thread));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
  Stack<const Klass*, mtTracing> mark_stack;
52356
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
    91
  MutexLocker ml(Compile_lock, thread);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
  mark_stack.push(event_klass->subklass());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  while (!mark_stack.is_empty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
    const Klass* const current = mark_stack.pop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
    assert(current != NULL, "null element in stack!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
    if (is_whitelisted(current)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
      event_subklasses.append(current);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
    // subclass (depth)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
    const Klass* next_klass = current->subklass();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
    if (next_klass != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
      mark_stack.push(next_klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
    // siblings (breadth)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
    next_klass = current->next_sibling();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
    if (next_klass != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
      mark_stack.push(next_klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
  assert(mark_stack.is_empty(), "invariant");
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
 static void transform_klasses_to_local_jni_handles(GrowableArray<const void*>& event_subklasses, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
  assert(event_subklasses.is_nonempty(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(thread));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  for (int i = 0; i < event_subklasses.length(); ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
    const InstanceKlass* k = static_cast<const InstanceKlass*>(event_subklasses.at(i));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
    assert(is_whitelisted(k), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
    event_subklasses.at_put(i, JfrJavaSupport::local_jni_handle(k->java_mirror(), thread));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
  }
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
static const int initial_size_growable_array = 64;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
jobject JfrEventClasses::get_all_event_classes(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
  initialize(THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
  assert(empty_java_util_arraylist != NULL, "should have been setup already!");
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52311
diff changeset
   134
  static const char jdk_jfr_event_name[] = "jdk/internal/event/Event";
54847
59ea39bb2809 8223657: Remove unused THREAD argument from SymbolTable functions
coleenp
parents: 52356
diff changeset
   135
  Symbol* const event_klass_name = SymbolTable::probe(jdk_jfr_event_name, sizeof jdk_jfr_event_name - 1);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
  if (NULL == event_klass_name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
    // not loaded yet
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
    return empty_java_util_arraylist;
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
  const Klass* const klass = SystemDictionary::resolve_or_null(event_klass_name, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
  assert(klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
  assert(JdkJfrEvent::is(klass), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
52356
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   146
  if (klass->subklass() == NULL) {
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   147
    return empty_java_util_arraylist;
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   148
  }
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   149
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
  ResourceMark rm(THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
  GrowableArray<const void*> event_subklasses(THREAD, initial_size_growable_array);
52356
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   152
  fill_klasses(event_subklasses, klass, THREAD);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
52356
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   154
  if (event_subklasses.is_empty()) {
19c4a3eec4d7 8213211: [BACKOUT] Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 52334
diff changeset
   155
    return empty_java_util_arraylist;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  transform_klasses_to_local_jni_handles(event_subklasses, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
  Handle h_array_list(THREAD, new_java_util_arraylist(THREAD));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
  assert(h_array_list.not_null(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
  static const char add_method_name[] = "add";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
  static const char add_method_signature[] = "(Ljava/lang/Object;)Z";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
  const Klass* const array_list_klass = JfrJavaSupport::klass(empty_java_util_arraylist);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  assert(array_list_klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
54847
59ea39bb2809 8223657: Remove unused THREAD argument from SymbolTable functions
coleenp
parents: 52356
diff changeset
   168
  const Symbol* const add_method_sym = SymbolTable::new_symbol(add_method_name);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
  assert(add_method_sym != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
54847
59ea39bb2809 8223657: Remove unused THREAD argument from SymbolTable functions
coleenp
parents: 52356
diff changeset
   171
  const Symbol* const add_method_sig_sym = SymbolTable::new_symbol(add_method_signature);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
  assert(add_method_signature != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
  JavaValue result(T_BOOLEAN);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
  for (int i = 0; i < event_subklasses.length(); ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
    const jclass clazz = (const jclass)event_subklasses.at(i);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
    assert(JdkJfrEvent::is_subklass(clazz), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
    JfrJavaArguments args(&result, array_list_klass, add_method_sym, add_method_sig_sym);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
    args.set_receiver(h_array_list());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
    args.push_jobject(clazz);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    JfrJavaSupport::call_virtual(&args, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
    if (HAS_PENDING_EXCEPTION || JNI_FALSE == result.get_jboolean()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
      return empty_java_util_arraylist;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
  return JfrJavaSupport::local_jni_handle(h_array_list(), THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
}