1 | /* |
2 | * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #include "precompiled.hpp" |
26 | #include "jfr/jni/jfrJniMethod.hpp" |
27 | #include "jfr/jni/jfrJniMethodRegistration.hpp" |
28 | #include "logging/log.hpp" |
29 | #include "runtime/interfaceSupport.inline.hpp" |
30 | #include "runtime/thread.hpp" |
31 | #include "utilities/exceptions.hpp" |
32 | |
33 | JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) { |
34 | assert(env != NULL, "invariant" ); |
35 | jclass jfr_clz = env->FindClass("jdk/jfr/internal/JVM" ); |
36 | if (jfr_clz != NULL) { |
37 | JNINativeMethod method[] = { |
38 | (char*)"beginRecording" , (char*)"()V" , (void*)jfr_begin_recording, |
39 | (char*)"endRecording" , (char*)"()V" , (void*)jfr_end_recording, |
40 | (char*)"counterTime" , (char*)"()J" , (void*)jfr_elapsed_counter, |
41 | (char*)"createJFR" , (char*)"(Z)Z" , (void*)jfr_create_jfr, |
42 | (char*)"destroyJFR" , (char*)"()Z" , (void*)jfr_destroy_jfr, |
43 | (char*)"emitEvent" , (char*)"(JJJ)Z" , (void*)jfr_emit_event, |
44 | (char*)"getAllEventClasses" , (char*)"()Ljava/util/List;" , (void*)jfr_get_all_event_classes, |
45 | (char*)"getClassIdNonIntrinsic" , (char*)"(Ljava/lang/Class;)J" , (void*)jfr_class_id, |
46 | (char*)"getPid" , (char*)"()Ljava/lang/String;" , (void*)jfr_get_pid, |
47 | (char*)"getStackTraceId" , (char*)"(I)J" , (void*)jfr_stacktrace_id, |
48 | (char*)"getThreadId" , (char*)"(Ljava/lang/Thread;)J" , (void*)jfr_id_for_thread, |
49 | (char*)"getTicksFrequency" , (char*)"()J" , (void*)jfr_elapsed_frequency, |
50 | (char*)"subscribeLogLevel" , (char*)"(Ljdk/jfr/internal/LogTag;I)V" , (void*)jfr_subscribe_log_level, |
51 | (char*)"log" , (char*)"(IILjava/lang/String;)V" , (void*)jfr_log, |
52 | (char*)"retransformClasses" , (char*)"([Ljava/lang/Class;)V" , (void*)jfr_retransform_classes, |
53 | (char*)"setEnabled" , (char*)"(JZ)V" , (void*)jfr_set_enabled, |
54 | (char*)"setFileNotification" , (char*)"(J)V" , (void*)jfr_set_file_notification, |
55 | (char*)"setGlobalBufferCount" , (char*)"(J)V" , (void*)jfr_set_global_buffer_count, |
56 | (char*)"setGlobalBufferSize" , (char*)"(J)V" , (void*)jfr_set_global_buffer_size, |
57 | (char*)"setMethodSamplingInterval" , (char*)"(JJ)V" , (void*)jfr_set_method_sampling_interval, |
58 | (char*)"setOutput" , (char*)"(Ljava/lang/String;)V" , (void*)jfr_set_output, |
59 | (char*)"setSampleThreads" , (char*)"(Z)V" , (void*)jfr_set_sample_threads, |
60 | (char*)"setStackDepth" , (char*)"(I)V" , (void*)jfr_set_stack_depth, |
61 | (char*)"setStackTraceEnabled" , (char*)"(JZ)V" , (void*)jfr_set_stacktrace_enabled, |
62 | (char*)"setThreadBufferSize" , (char*)"(J)V" , (void*)jfr_set_thread_buffer_size, |
63 | (char*)"setMemorySize" , (char*)"(J)V" , (void*)jfr_set_memory_size, |
64 | (char*)"setThreshold" , (char*)"(JJ)Z" , (void*)jfr_set_threshold, |
65 | (char*)"storeMetadataDescriptor" , (char*)"([B)V" , (void*)jfr_store_metadata_descriptor, |
66 | (char*)"getAllowedToDoEventRetransforms" , (char*)"()Z" , (void*)jfr_allow_event_retransforms, |
67 | (char*)"isAvailable" , (char*)"()Z" , (void*)jfr_is_available, |
68 | (char*)"getTimeConversionFactor" , (char*)"()D" , (void*)jfr_time_conv_factor, |
69 | (char*)"getTypeId" , (char*)"(Ljava/lang/Class;)J" , (void*)jfr_type_id, |
70 | (char*)"getEventWriter" , (char*)"()Ljava/lang/Object;" , (void*)jfr_get_event_writer, |
71 | (char*)"newEventWriter" , (char*)"()Ljdk/jfr/internal/EventWriter;" , (void*)jfr_new_event_writer, |
72 | (char*)"flush" , (char*)"(Ljdk/jfr/internal/EventWriter;II)Z" , (void*)jfr_event_writer_flush, |
73 | (char*)"setRepositoryLocation" , (char*)"(Ljava/lang/String;)V" , (void*)jfr_set_repository_location, |
74 | (char*)"abort" , (char*)"(Ljava/lang/String;)V" , (void*)jfr_abort, |
75 | (char*)"getEpochAddress" , (char*)"()J" ,(void*)jfr_get_epoch_address, |
76 | (char*)"addStringConstant" , (char*)"(ZJLjava/lang/String;)Z" , (void*)jfr_add_string_constant, |
77 | (char*)"uncaughtException" , (char*)"(Ljava/lang/Thread;Ljava/lang/Throwable;)V" , (void*)jfr_uncaught_exception, |
78 | (char*)"setForceInstrumentation" , (char*)"(Z)V" , (void*)jfr_set_force_instrumentation, |
79 | (char*)"getUnloadedEventClassCount" , (char*)"()J" , (void*)jfr_get_unloaded_event_classes_count, |
80 | (char*)"setCutoff" , (char*)"(JJ)Z" , (void*)jfr_set_cutoff, |
81 | (char*)"emitOldObjectSamples" , (char*)"(JZ)V" , (void*)jfr_emit_old_object_samples, |
82 | (char*)"shouldRotateDisk" , (char*)"()Z" , (void*)jfr_should_rotate_disk |
83 | }; |
84 | |
85 | const size_t method_array_length = sizeof(method) / sizeof(JNINativeMethod); |
86 | if (env->RegisterNatives(jfr_clz, method, (jint)method_array_length) != JNI_OK) { |
87 | JavaThread* jt = JavaThread::thread_from_jni_environment(env); |
88 | assert(jt != NULL, "invariant" ); |
89 | assert(jt->thread_state() == _thread_in_native, "invariant" ); |
90 | ThreadInVMfromNative transition(jt); |
91 | log_error(jfr, system)("RegisterNatives for JVM class failed!" ); |
92 | } |
93 | env->DeleteLocalRef(jfr_clz); |
94 | } |
95 | } |
96 | |