src/hotspot/share/jfr/jni/jfrGetAllEventClasses.cpp
author egahlin
Wed, 31 Oct 2018 02:10:21 +0100
changeset 52334 a181612f0715
parent 52311 274ba8fbd96d
child 52356 19c4a3eec4d7
permissions -rw-r--r--
8203629: Produce events in the JDK without a dependency on jdk.jfr Reviewed-by: mgronlun
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
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/safepoint.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
#include "utilities/growableArray.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
#include "utilities/stack.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
 // incremented during class unloading (safepoint) for each unloaded event class
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
static jlong unloaded_event_classes = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
jlong JfrEventClasses::unloaded_event_classes_count() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
  return unloaded_event_classes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
void JfrEventClasses::increment_unloaded_event_class() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  // incremented during class unloading (safepoint) for each unloaded event class
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  assert(SafepointSynchronize::is_at_safepoint(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  ++unloaded_event_classes;
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 jobject empty_java_util_arraylist = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
static oop new_java_util_arraylist(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
  JavaValue result(T_OBJECT);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  JfrJavaArguments args(&result, "java/util/ArrayList", "<init>", "()V", CHECK_NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
  JfrJavaSupport::new_object(&args, CHECK_NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  return (oop)result.get_jobject();
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 bool initialize(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
  static bool initialized = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
  if (!initialized) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    unloaded_event_classes = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    assert(NULL == empty_java_util_arraylist, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
    const oop array_list = new_java_util_arraylist(CHECK_false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
    empty_java_util_arraylist = JfrJavaSupport::global_jni_handle(array_list, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
    initialized = empty_java_util_arraylist != NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
  return initialized;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
 * Abstract klasses are filtered out unconditionally.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
 * If a klass is not yet initialized, i.e yet to run its <clinit>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
 * it is also filtered out so we don't accidentally
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
 * trigger initialization.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
static bool is_whitelisted(const Klass* k) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  assert(k != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
  return !(k->is_abstract() || k->should_be_initialized());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
static void fill_klasses(GrowableArray<const void*>& event_subklasses, const Klass* event_klass, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
  assert(event_subklasses.length() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
  assert(event_klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(thread));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
  Stack<const Klass*, mtTracing> mark_stack;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
  mark_stack.push(event_klass->subklass());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
  while (!mark_stack.is_empty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
    const Klass* const current = mark_stack.pop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
    assert(current != NULL, "null element in stack!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
    if (is_whitelisted(current)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
      event_subklasses.append(current);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
    // subclass (depth)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
    const Klass* next_klass = current->subklass();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
    if (next_klass != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
      mark_stack.push(next_klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
    // siblings (breadth)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
    next_klass = current->next_sibling();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
    if (next_klass != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
      mark_stack.push(next_klass);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
  assert(mark_stack.is_empty(), "invariant");
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
 static void transform_klasses_to_local_jni_handles(GrowableArray<const void*>& event_subklasses, Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
  assert(event_subklasses.is_nonempty(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(thread));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
  for (int i = 0; i < event_subklasses.length(); ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
    const InstanceKlass* k = static_cast<const InstanceKlass*>(event_subklasses.at(i));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
    assert(is_whitelisted(k), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
    event_subklasses.at_put(i, JfrJavaSupport::local_jni_handle(k->java_mirror(), thread));
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
static const int initial_size_growable_array = 64;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
jobject JfrEventClasses::get_all_event_classes(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
  DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(THREAD));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
  initialize(THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  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
   135
  static const char jdk_jfr_event_name[] = "jdk/internal/event/Event";
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
  unsigned int unused_hash = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
  Symbol* const event_klass_name = SymbolTable::lookup_only(jdk_jfr_event_name, sizeof jdk_jfr_event_name - 1, unused_hash);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
  if (NULL == event_klass_name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
    // not loaded yet
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
    return empty_java_util_arraylist;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
  const Klass* const klass = SystemDictionary::resolve_or_null(event_klass_name, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
  assert(klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
  assert(JdkJfrEvent::is(klass), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
  ResourceMark rm(THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
  GrowableArray<const void*> event_subklasses(THREAD, initial_size_growable_array);
52311
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   150
  {
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   151
    MutexLocker cl(Compile_lock);
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   152
    if (klass->subklass() == NULL) {
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   153
      return empty_java_util_arraylist;
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   154
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
52311
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   156
    fill_klasses(event_subklasses, klass, THREAD);
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   157
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   158
    if (event_subklasses.is_empty()) {
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   159
      return empty_java_util_arraylist;
274ba8fbd96d 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
coleenp
parents: 50113
diff changeset
   160
    }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
  transform_klasses_to_local_jni_handles(event_subklasses, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
  Handle h_array_list(THREAD, new_java_util_arraylist(THREAD));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  assert(h_array_list.not_null(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
  static const char add_method_name[] = "add";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
  static const char add_method_signature[] = "(Ljava/lang/Object;)Z";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
  const Klass* const array_list_klass = JfrJavaSupport::klass(empty_java_util_arraylist);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
  assert(array_list_klass != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
  const Symbol* const add_method_sym = SymbolTable::lookup(add_method_name, sizeof add_method_name - 1, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
  assert(add_method_sym != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
  const Symbol* const add_method_sig_sym = SymbolTable::lookup(add_method_signature, sizeof add_method_signature - 1, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  assert(add_method_signature != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  JavaValue result(T_BOOLEAN);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  for (int i = 0; i < event_subklasses.length(); ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    const jclass clazz = (const jclass)event_subklasses.at(i);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
    assert(JdkJfrEvent::is_subklass(clazz), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
    JfrJavaArguments args(&result, array_list_klass, add_method_sym, add_method_sig_sym);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
    args.set_receiver(h_array_list());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
    args.push_jobject(clazz);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
    JfrJavaSupport::call_virtual(&args, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
    if (HAS_PENDING_EXCEPTION || JNI_FALSE == result.get_jboolean()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
      return empty_java_util_arraylist;
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
  return JfrJavaSupport::local_jni_handle(h_array_list(), THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
}