Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/hotspot/share/jfr/jni/jfrJniMethod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "jfr/recorder/stacktrace/jfrStackFilterRegistry.hpp"
#include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp"
#include "jfr/recorder/stringpool/jfrStringPool.hpp"
#include "jfr/support/jfrAsyncEvent.hpp"
#include "jfr/support/jfrDeprecationManager.hpp"
#include "jfr/support/jfrJdkJfrEvent.hpp"
#include "jfr/support/jfrKlassUnloading.hpp"
Expand Down Expand Up @@ -461,3 +462,7 @@ JVM_END
JVM_ENTRY_NO_ENV(jlongArray, jfr_drain_stale_method_tracer_ids(JNIEnv* env, jclass jvm))
return JfrMethodTracer::drain_stale_class_ids(thread);
JVM_END

JVM_ENTRY_NO_ENV(void, jfr_send_asysnc_event(JNIEnv* env, jclass jvm, jobject target, jlong eventId, jboolean hasDuration, jboolean hasEventThread, jboolean hasStackTrace, jbyteArray payload))
JfrAsyncEvent::send(thread, target, eventId, hasDuration, hasEventThread, hasStackTrace, payload);
JVM_END
1 change: 1 addition & 0 deletions src/hotspot/share/jfr/jni/jfrJniMethod.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ jlongArray JNICALL jfr_set_method_trace_filters(JNIEnv* env, jclass jvm, jobject

jlongArray JNICALL jfr_drain_stale_method_tracer_ids(JNIEnv* env, jclass);

void JNICALL jfr_send_asysnc_event(JNIEnv* env, jclass clz, jobject thread, jlong eventId, jboolean hasDuration, jboolean hasEventThread, jboolean hasStackTrace, jbyteArray payload);
#ifdef __cplusplus
}
#endif
Expand Down
5 changes: 4 additions & 1 deletion src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "logging/log.hpp"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/javaThread.inline.hpp"
#include "runtime/threadWXSetters.inline.hpp"
#include "utilities/exceptions.hpp"

JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) {
Expand Down Expand Up @@ -105,14 +106,16 @@ JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) {
(char*)"nanosNow", (char*)"()J", (void*)jfr_nanos_now,
(char*)"isProduct", (char*)"()Z", (void*)jfr_is_product,
(char*)"setMethodTraceFilters", (char*)"([Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[I)[J", (void*)jfr_set_method_trace_filters,
(char*)"drainStaleMethodTracerIds", (char*)"()[J", (void*)jfr_drain_stale_method_tracer_ids
(char*)"drainStaleMethodTracerIds", (char*)"()[J", (void*)jfr_drain_stale_method_tracer_ids,
(char*)"sendAsyncEvent", (char*)"(Ljava/lang/Thread;JZZZ[B)V", (void*)jfr_send_asysnc_event
};

const size_t method_array_length = sizeof(method) / sizeof(JNINativeMethod);
if (env->RegisterNatives(jfr_clz, method, (jint)method_array_length) != JNI_OK) {
JavaThread* jt = JavaThread::thread_from_jni_environment(env);
assert(jt != nullptr, "invariant");
assert(jt->thread_state() == _thread_in_native, "invariant");
MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, jt));
ThreadInVMfromNative transition(jt);
log_error(jfr, system)("RegisterNatives for JVM class failed!");
}
Expand Down
7 changes: 5 additions & 2 deletions src/hotspot/share/jfr/periodic/sampling/jfrSampleRequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,14 +284,16 @@ static inline JfrSampleResult set_unbiased_java_sample(JfrSampleRequest& request

JfrSampleResult JfrSampleRequestBuilder::build_java_sample_request(const void* ucontext,
JfrThreadLocal* tl,
JavaThread* jt) {
JavaThread* jt,
AsyncCallback callback,
void* context) {
assert(ucontext != nullptr, "invariant");
assert(tl != nullptr, "invariant");
assert(tl->sample_state() == NO_SAMPLE, "invariant");
assert(jt != nullptr, "invariant");
assert(jt->thread_state() == _thread_in_Java, "invariant");

JfrSampleRequest request;
JfrSampleRequest request(callback, context);

// Prioritize the ljf, if one exists.
request._sample_sp = jt->last_Java_sp();
Expand Down Expand Up @@ -334,3 +336,4 @@ void JfrSampleRequestBuilder::build_cpu_time_sample_request(JfrSampleRequest& re
}
}
}

29 changes: 25 additions & 4 deletions src/hotspot/share/jfr/periodic/sampling/jfrSampleRequest.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,24 @@
#define SHARE_JFR_PERIODIC_SAMPLING_JFRSAMPLEREQUEST_HPP

#include "jfr/utilities/jfrTime.hpp"
#include "jfr/utilities/jfrTypes.hpp"
#include "memory/allocation.hpp"
#include "utilities/growableArray.hpp"

class JavaThread;
class JfrThreadLocal;

enum JfrAsyncCallbackReason {
COMMIT_EVENT, // Sample succeeded, callback to commit the event
ABORT_EVENT // Sample failed, abort
};

typedef void (*AsyncCallback)(JfrAsyncCallbackReason reason,
void* context,
const JfrTicks* start_time,
const JfrTicks* end_time,
traceid sid,
traceid tid);
enum JfrSampleResult {
THREAD_SUSPENSION_ERROR,
WRONG_THREAD_STATE,
Expand Down Expand Up @@ -60,18 +72,25 @@ struct JfrSampleRequest {
void* _sample_pc;
void* _sample_bcp;
JfrTicks _sample_ticks;
// Asynchronous event support
AsyncCallback _callback;
void* _context;

JfrSampleRequest() :
JfrSampleRequest(AsyncCallback callback = nullptr, void* context = nullptr) :
_sample_sp(nullptr),
_sample_pc(nullptr),
_sample_bcp(nullptr),
_sample_ticks() {}
_sample_ticks(),
_callback(callback),
_context(context) { }

JfrSampleRequest(const JfrTicks& ticks) :
_sample_sp(nullptr),
_sample_pc(nullptr),
_sample_bcp(nullptr),
_sample_ticks(ticks) {}
_sample_ticks(ticks),
_callback(nullptr),
_context(nullptr) { }
};

typedef GrowableArrayCHeap<JfrSampleRequest, mtTracing> JfrSampleRequestQueue;
Expand All @@ -80,7 +99,9 @@ class JfrSampleRequestBuilder : AllStatic {
public:
static JfrSampleResult build_java_sample_request(const void* ucontext,
JfrThreadLocal* tl,
JavaThread* jt);
JavaThread* jt,
AsyncCallback callback,
void* context);
static void build_cpu_time_sample_request(JfrSampleRequest &request,
void* ucontext,
JavaThread* jt,
Expand Down
Loading