Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
4ed215f
Enable DD JDK integration tests
jbachorik Jun 21, 2023
cdf915e
Merge branch 'upstream-master'
Jun 21, 2023
eac40e2
Merge branch 'upstream-master'
Jun 22, 2023
4b96877
Merge branch 'upstream-master'
Jun 23, 2023
3f7172a
Merge branch 'upstream-master'
Jun 24, 2023
5ab1610
Merge branch 'upstream-master'
Jun 26, 2023
4ad86bd
Merge branch 'upstream-master'
Jun 27, 2023
069e812
Merge branch 'upstream-master'
Jun 28, 2023
db99501
Merge branch 'upstream-master'
Jun 29, 2023
0009f6e
Merge branch 'upstream-master'
Jun 30, 2023
9860489
Merge branch 'upstream-master'
Jul 1, 2023
c166cc6
Merge branch 'upstream-master'
Jul 2, 2023
6892063
Merge branch 'upstream-master'
Jul 3, 2023
78fe42e
Merge branch 'upstream-master'
Jul 4, 2023
71591a6
Merge branch 'upstream-master'
Jul 5, 2023
226e410
Merge branch 'upstream-master'
Jul 6, 2023
3403988
Merge branch 'upstream-master'
Jul 7, 2023
76478fb
Merge branch 'upstream-master'
Jul 8, 2023
e57fec0
Merge branch 'upstream-master'
Jul 10, 2023
3aec829
Merge branch 'upstream-master'
Jul 11, 2023
01df99b
Merge branch 'upstream-master'
Jul 12, 2023
e8c4a07
Merge branch 'upstream-master'
Jul 13, 2023
d62c1c2
Merge branch 'upstream-master'
Jul 14, 2023
aa1729d
Merge branch 'upstream-master'
Jul 15, 2023
f158a81
Merge branch 'upstream-master'
Jul 16, 2023
7030bcb
Merge branch 'upstream-master'
Jul 17, 2023
50236f7
Merge branch 'upstream-master'
Jul 18, 2023
6ac7f17
Merge branch 'upstream-master'
Jul 19, 2023
3d651b7
Merge branch 'upstream-master'
Jul 20, 2023
5ab33fa
Merge branch 'upstream-master'
Jul 21, 2023
c0039a7
Merge branch 'upstream-master'
Jul 22, 2023
fa28f52
Merge branch 'upstream-master'
Jul 23, 2023
a3517cb
Merge branch 'upstream-master'
Jul 24, 2023
1038c07
Merge branch 'upstream-master'
Jul 25, 2023
8ab4463
Merge branch 'upstream-master'
Jul 26, 2023
8f07835
Merge branch 'upstream-master'
Jul 27, 2023
25c9398
Merge branch 'upstream-master'
Jul 28, 2023
f5f5540
Merge branch 'upstream-master'
Jul 29, 2023
303b38a
Merge branch 'upstream-master'
Jul 31, 2023
275d648
Merge branch 'upstream-master'
Aug 1, 2023
4ceb59f
Merge branch 'upstream-master'
Aug 2, 2023
d4cddf1
Merge branch 'upstream-master'
Aug 3, 2023
776ae18
Merge branch 'upstream-master'
Aug 4, 2023
50ecba3
Merge branch 'upstream-master'
Aug 5, 2023
b3d9191
Merge branch 'upstream-master'
Aug 7, 2023
11471ca
Merge branch 'upstream-master'
Aug 8, 2023
f2bacab
Merge branch 'upstream-master'
Aug 9, 2023
84d4f83
Merge branch 'upstream-master'
Aug 10, 2023
9f4458d
Merge branch 'upstream-master'
Aug 11, 2023
65b2afa
Merge branch 'upstream-master'
Aug 12, 2023
2eee387
Merge branch 'upstream-master'
Aug 14, 2023
aefbccf
Merge branch 'upstream-master'
Aug 15, 2023
37aa13d
Merge branch 'upstream-master'
Aug 16, 2023
7f5c369
Merge branch 'upstream-master'
Aug 17, 2023
602137c
Merge branch 'upstream-master'
Aug 18, 2023
43d8d6e
Merge branch 'upstream-master'
Aug 19, 2023
b72635b
Merge branch 'upstream-master'
Aug 20, 2023
6d6c28b
Merge branch 'upstream-master'
Aug 21, 2023
bd9deab
Merge branch 'upstream-master'
Aug 22, 2023
3e2d6aa
Merge branch 'upstream-master'
Aug 23, 2023
ea87110
Merge branch 'upstream-master'
Aug 24, 2023
721de0a
Merge branch 'upstream-master'
Aug 25, 2023
3ea7eb4
Merge branch 'upstream-master'
Aug 26, 2023
581240c
Merge branch 'upstream-master'
Aug 27, 2023
629f34f
Merge branch 'upstream-master'
Aug 28, 2023
1e25540
tmp
jbachorik Oct 18, 2023
6c1eed1
Trivial prototype of JFR context
jbachorik Oct 18, 2023
a29d052
Add stateless setter API
jbachorik Oct 18, 2023
6ea2b4f
More improvements
jbachorik Oct 18, 2023
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
34 changes: 34 additions & 0 deletions .github/workflows/dd-sync.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# .github/workflows/sync-upstream.yml
name: Sync Upstream

on:
schedule:
- cron: '22 14 * * *' # Runs every day at 14:15 UTC
workflow_dispatch:

jobs:
sync:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2
with:
persist-credentials: false
fetch-depth: 0

- name: Pull latest changes from upstream
run: |
git config --global user.email "[email protected]"
git config --global user.name "Datadog Syncup Service"
git remote add upstream https://github.com/openjdk/jdk.git
git fetch upstream
git checkout -b upstream-master upstream/master
git checkout master
git merge upstream-master

- name: Push changes to downstream
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GH_PAT }}
branch: master
30 changes: 30 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
image: alpine

stages: [trigger]

build:
stage: trigger
variables:
JDK_VERSION: "22"
DEBUG_LEVEL: "fastdebug"
HASH: "${CI_COMMIT_SHORT_SHA}"
trigger:
project: DataDog/openjdk-build
strategy: depend
branch: main
forward:
pipeline_variables: true

test:
stage: trigger
needs: [build]
variables:
JDK_VERSION: "22"
DEBUG_LEVEL: "fastdebug"
HASH: "${CI_COMMIT_SHORT_SHA}"
trigger:
project: DataDog/apm-reliability/async-profiler-build
strategy: depend
branch: main
forward:
pipeline_variables: true
7 changes: 6 additions & 1 deletion make/src/classes/build/tools/jfr/GenerateJfrFiles.java
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ static class TypeElement {
boolean isEvent;
boolean isRelation;
boolean supportStruct = false;
boolean withContext = false;
String commitState;
public boolean primitive;

Expand All @@ -227,6 +228,7 @@ public void persist(DataOutputStream pos) throws IOException {
pos.writeLong(id);
pos.writeBoolean(isEvent);
pos.writeBoolean(isRelation);
pos.writeBoolean(withContext);
}
}

Expand Down Expand Up @@ -524,6 +526,7 @@ public void startElement(String uri, String localName, String qName, Attributes
currentType.commitState = getString(attributes, "commitState");
currentType.isEvent = "Event".equals(qName);
currentType.isRelation = "Relation".equals(qName);
currentType.withContext = getBoolean(attributes, "withContext", false);
break;
case "Field":
currentField = new FieldElement(metadata);
Expand Down Expand Up @@ -655,7 +658,8 @@ private static void printJfrEventControlHpp(Metadata metadata, File outputFile)
out.write(" u1 stacktrace;");
out.write(" u1 enabled;");
out.write(" u1 large;");
out.write(" u1 pad[5]; // Because GCC on linux ia32 at least tries to pack this.");
out.write(" u1 context;");
out.write(" u1 pad[4]; // Because GCC on linux ia32 at least tries to pack this.");
out.write("};");
out.write("");
out.write("union JfrNativeSettings {");
Expand Down Expand Up @@ -860,6 +864,7 @@ private static void printEvent(Printer out, TypeElement event, boolean empty) {
out.write(" static const bool isInstant = " + !event.startTime + ";");
out.write(" static const bool hasCutoff = " + event.cutoff + ";");
out.write(" static const bool hasThrottle = " + event.throttle + ";");
out.write(" static const bool hasContext = " + event.withContext + ";");
out.write(" static const bool isRequestable = " + !event.period.isEmpty() + ";");
out.write(" static const JfrEventId eventId = Jfr" + event.name + "Event;");
out.write("");
Expand Down
15 changes: 15 additions & 0 deletions src/hotspot/share/jfr/jni/jfrJniMethod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "jfr/instrumentation/jfrEventClassTransformer.hpp"
#include "jfr/instrumentation/jfrJvmtiAgent.hpp"
#include "jfr/leakprofiler/leakProfiler.hpp"
#include "jfr/support/jfrContext.hpp"
#include "jfr/support/jfrJdkJfrEvent.hpp"
#include "jfr/support/jfrKlassUnloading.hpp"
#include "jfr/utilities/jfrJavaLog.hpp"
Expand Down Expand Up @@ -397,3 +398,17 @@ JVM_END
JVM_ENTRY_NO_ENV(void, jfr_emit_data_loss(JNIEnv* env, jclass jvm, jlong bytes))
EventDataLoss::commit(bytes, min_jlong);
JVM_END

NO_TRANSITION(void, jfr_set_used_context_size(JNIEnv* env, jclass jvm, jint size))
JfrContext::set_used_context_size(size);
NO_TRANSITION_END

NO_TRANSITION(jboolean, jfr_is_context_enabled(JNIEnv* env, jclass jvmf))
return JfrOptionSet::is_context_enabled();
NO_TRANSITION_END

NO_TRANSITION(jobject, jfr_get_thread_context_buffer(JNIEnv* env, jclass jvm))
uint64_t* data;
uint8_t size = JfrContext::get_context(&data);
return env->NewDirectByteBuffer((void*)data, (jlong) size * 8);
NO_TRANSITION_END
4 changes: 4 additions & 0 deletions src/hotspot/share/jfr/jni/jfrJniMethod.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ jlong JNICALL jfr_host_total_memory(JNIEnv* env, jclass jvm);

void JNICALL jfr_emit_data_loss(JNIEnv* env, jclass jvm, jlong bytes);

void JNICALL jfr_set_used_context_size(JNIEnv* env, jclass jvm, jint size);
jboolean JNICALL jfr_is_context_enabled(JNIEnv* env, jclass jvm);
jobject JNICALL jfr_get_thread_context_buffer(JNIEnv* env, jclass jvm);

#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 @@ -97,7 +97,10 @@ JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) {
(char*)"isInstrumented", (char*)"(Ljava/lang/Class;)Z", (void*) jfr_is_class_instrumented,
(char*)"isContainerized", (char*)"()Z", (void*) jfr_is_containerized,
(char*)"hostTotalMemory", (char*)"()J", (void*) jfr_host_total_memory,
(char*)"emitDataLoss", (char*)"(J)V", (void*)jfr_emit_data_loss
(char*)"emitDataLoss", (char*)"(J)V", (void*)jfr_emit_data_loss,
(char*)"setUsedContextSize", (char*)"(I)V", (void*)jfr_set_used_context_size,
(char*)"isContextEnabled", (char*)"()Z", (void*)jfr_is_context_enabled,
(char*)"getThreadContextBuffer0", (char*)"()Ljava/lang/Object;", (void*)jfr_get_thread_context_buffer
};

const size_t method_array_length = sizeof(method) / sizeof(JNINativeMethod);
Expand Down
22 changes: 11 additions & 11 deletions src/hotspot/share/jfr/metadata/metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,28 +89,28 @@
<Field type="Thread" name="thread" label="Java Thread" />
</Event>

<Event name="ThreadPark" category="Java Application" label="Java Thread Park" thread="true" stackTrace="true">
<Event name="ThreadPark" category="Java Application" label="Java Thread Park" thread="true" stackTrace="true" withContext="true">
<Field type="Class" name="parkedClass" label="Class Parked On" />
<Field type="long" contentType="nanos" name="timeout" label="Park Timeout" />
<Field type="long" contentType="epochmillis" name="until" label="Park Until" />
<Field type="ulong" contentType="address" name="address" label="Address of Object Parked" relation="JavaMonitorAddress" />
</Event>

<Event name="JavaMonitorEnter" category="Java Application" label="Java Monitor Blocked" thread="true" stackTrace="true">
<Event name="JavaMonitorEnter" category="Java Application" label="Java Monitor Blocked" thread="true" stackTrace="true" withContext="true">
<Field type="Class" name="monitorClass" label="Monitor Class" />
<Field type="Thread" name="previousOwner" label="Previous Monitor Owner" />
<Field type="ulong" contentType="address" name="address" label="Monitor Address" relation="JavaMonitorAddress" />
</Event>

<Event name="JavaMonitorWait" category="Java Application" label="Java Monitor Wait" description="Waiting on a Java monitor" thread="true" stackTrace="true">
<Event name="JavaMonitorWait" category="Java Application" label="Java Monitor Wait" description="Waiting on a Java monitor" thread="true" stackTrace="true" withContext="true">
<Field type="Class" name="monitorClass" label="Monitor Class" description="Class of object waited on" />
<Field type="Thread" name="notifier" label="Notifier Thread" description="Notifying Thread" />
<Field type="long" contentType="millis" name="timeout" label="Timeout" description="Maximum wait time" />
<Field type="boolean" name="timedOut" label="Timed Out" description="Wait has been timed out" />
<Field type="ulong" contentType="address" name="address" label="Monitor Address" description="Address of object waited on" relation="JavaMonitorAddress" />
</Event>

<Event name="JavaMonitorInflate" category="Java Application" label="Java Monitor Inflated" thread="true" stackTrace="true">
<Event name="JavaMonitorInflate" category="Java Application" label="Java Monitor Inflated" thread="true" stackTrace="true" withContext="true">
<Field type="Class" name="monitorClass" label="Monitor Class" />
<Field type="ulong" contentType="address" name="address" label="Monitor Address" relation="JavaMonitorAddress" />
<Field type="InflateCause" name="cause" label="Monitor Inflation Cause" description="Cause of inflation" />
Expand Down Expand Up @@ -359,7 +359,7 @@
<Field type="Tickspan" name="longestPause" label="Longest Pause" description="Longest individual pause during the garbage collection" />
</Event>

<Event name="SystemGC" category="Java Virtual Machine, GC, Collector" label="System GC" stackTrace="true" startTime="true" thread="true">
<Event name="SystemGC" category="Java Virtual Machine, GC, Collector" label="System GC" stackTrace="true" startTime="true" thread="true" withContext="true">
<Field type="boolean" name="invokedConcurrent" label="Invoked Concurrent" />
</Event>

Expand Down Expand Up @@ -715,19 +715,19 @@
</Event>

<Event name="ObjectAllocationInNewTLAB" category="Java Application" label="Allocation in new TLAB" description="Allocation in new Thread Local Allocation Buffer"
thread="true" stackTrace="true" startTime="false">
thread="true" stackTrace="true" startTime="false" withContext="true">
<Field type="Class" name="objectClass" label="Object Class" description="Class of allocated object" />
<Field type="ulong" contentType="bytes" name="allocationSize" label="Allocation Size" />
<Field type="ulong" contentType="bytes" name="tlabSize" label="TLAB Size" />
</Event>

<Event name="ObjectAllocationOutsideTLAB" category="Java Application" label="Allocation outside TLAB" description="Allocation outside Thread Local Allocation Buffers"
thread="true" stackTrace="true" startTime="false">
thread="true" stackTrace="true" startTime="false" withContext="true">
<Field type="Class" name="objectClass" label="Object Class" description="Class of allocated object" />
<Field type="ulong" contentType="bytes" name="allocationSize" label="Allocation Size" />
</Event>

<Event name="ObjectAllocationSample" category="Java Application" label="Object Allocation Sample" thread="true" stackTrace="true" startTime="false" throttle="true">
<Event name="ObjectAllocationSample" category="Java Application" label="Object Allocation Sample" thread="true" stackTrace="true" startTime="false" throttle="true" withContext="true">
<Field type="Class" name="objectClass" label="Object Class" description="Class of allocated object" />
<Field type="long" contentType="bytes" name="weight" label="Sample Weight"
description="The relative weight of the sample. Aggregating the weights for a large number of samples, for a particular class, thread or stack trace, gives a statistically accurate representation of the allocation pressure" />
Expand Down Expand Up @@ -915,14 +915,14 @@
</Event>

<Event name="ExecutionSample" category="Java Virtual Machine, Profiling" label="Method Profiling Sample" description="Snapshot of a threads state"
period="everyChunk">
period="everyChunk" withContext="true">
<Field type="Thread" name="sampledThread" label="Thread" />
<Field type="StackTrace" name="stackTrace" label="Stack Trace" />
<Field type="ThreadState" name="state" label="Thread State" />
</Event>

<Event name="NativeMethodSample" category="Java Virtual Machine, Profiling" label="Method Profiling Sample Native" description="Snapshot of a threads state when in native"
period="everyChunk">
period="everyChunk" withContext="true">
<Field type="Thread" name="sampledThread" label="Thread" />
<Field type="StackTrace" name="stackTrace" label="Stack Trace" />
<Field type="ThreadState" name="state" label="Thread State" />
Expand Down Expand Up @@ -1118,7 +1118,7 @@
<Field type="uint" name="gcId" label="GC Identifier" relation="GcId" />
</Event>

<Event name="ZAllocationStall" category="Java Virtual Machine, GC, Detailed" label="ZGC Allocation Stall" description="Time spent waiting for memory to become available" thread="true">
<Event name="ZAllocationStall" category="Java Virtual Machine, GC, Detailed" label="ZGC Allocation Stall" description="Time spent waiting for memory to become available" thread="true" withContext="true">
<Field type="ZPageTypeType" name="type" label="Type" />
<Field type="ulong" contentType="bytes" name="size" label="Size" />
</Event>
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/share/jfr/metadata/metadata.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
<xs:attribute name="period" type="periodType" use="optional" />
<xs:attribute name="cutoff" type="xs:boolean" use="optional" />
<xs:attribute name="throttle" type="xs:boolean" use="optional" />
<xs:attribute name="withContext" type="xs:boolean" use="optional" />
</xs:complexType>
</xs:element>
<xs:element maxOccurs="unbounded" name="Type">
Expand Down
8 changes: 8 additions & 0 deletions src/hotspot/share/jfr/recorder/service/jfrEvent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "jfr/recorder/jfrEventSetting.inline.hpp"
#include "jfr/recorder/service/jfrEventThrottler.hpp"
#include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp"
#include "jfr/support/jfrContext.hpp"
#include "jfr/utilities/jfrTime.hpp"
#include "jfr/utilities/jfrTypes.hpp"
#include "jfr/writers/jfrNativeEventWriter.hpp"
Expand Down Expand Up @@ -243,6 +244,13 @@ class JfrEvent {
if (T::hasStackTrace) {
writer.write(sid);
}
if (T::hasContext) {
uint64_t* data;
uint8_t ctx_len = JfrContext::get_context(&data);
for (uint8_t i = 0; i < ctx_len; i++) {
writer.write(data[i]);
}
}
// Payload.
static_cast<T*>(this)->writeData(writer);
return writer.end_event_write(large_size) > 0;
Expand Down
7 changes: 7 additions & 0 deletions src/hotspot/share/jfr/recorder/service/jfrOptionSet.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class JfrOptionSet : public AllStatic {
static u4 _stack_depth;
static jboolean _retransform;
static jboolean _sample_protection;
static jboolean _context;

static bool initialize(JavaThread* thread);
static bool configure(TRAPS);
Expand Down Expand Up @@ -74,6 +75,12 @@ class JfrOptionSet : public AllStatic {
static bool allow_event_retransforms();
static bool sample_protection();
DEBUG_ONLY(static void set_sample_protection(jboolean protection);)
static void enable_context() {
_context = true;
}
static bool is_context_enabled() {
return true; // _context;
}

static bool parse_flight_recorder_option(const JavaVMOption** option, char* delimiter);
static bool parse_start_flight_recording_option(const JavaVMOption** option, char* delimiter);
Expand Down
67 changes: 67 additions & 0 deletions src/hotspot/share/jfr/support/jfrContext.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "precompiled.hpp"
#include "jfrContext.hpp"
#include "jfr/support/jfrThreadLocal.hpp"
#include "runtime/thread.hpp"

#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif

uint8_t JfrContext::_size = 0;

JfrThreadLocal* getThreadLocal() {
Thread* thrd = Thread::current_or_null_safe();
return thrd != nullptr ? thrd->jfr_thread_local() : nullptr;
}

void JfrContext::set_used_context_size(uint8_t size) {
assert(size <= 8, "max context size is 8");
_size = size;
}

uint64_t JfrContext::get_and_set_context(uint8_t idx, uint64_t value) {
JfrThreadLocal* jfrTLocal = getThreadLocal();
if (jfrTLocal != nullptr) {
uint64_t old_value = 0;
jfrTLocal->get_context(&old_value, 1, idx);
jfrTLocal->set_context(&value, 1, idx);
return old_value;
}
return 0;
}

uint8_t JfrContext::get_all_context(uint64_t* data, uint8_t length) {
JfrThreadLocal* jfrTLocal = getThreadLocal();
if (jfrTLocal != nullptr) {
return jfrTLocal->get_context(data, MIN(_size, length), 0);
}

return 0;
}

uint8_t JfrContext::get_context(uint64_t** data) {
void* buffer = get_thread_context_buffer();
if (buffer) {
*data = (uint64_t*) buffer;
return _size;
}
return 0;
}

uint8_t JfrContext::set_all_context(uint64_t* data, uint8_t length) {
JfrThreadLocal* jfrTLocal = getThreadLocal();
if (jfrTLocal != nullptr) {
jfrTLocal->set_context(data, MIN(_size, length), 0);
return length;
}

return 0;
}

void* JfrContext::get_thread_context_buffer() {
JfrThreadLocal* jfrTLocal = getThreadLocal();
if (jfrTLocal != nullptr) {
return (void*)jfrTLocal->get_context_buffer();
}
return nullptr;
}
20 changes: 20 additions & 0 deletions src/hotspot/share/jfr/support/jfrContext.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#ifndef SHARE_JFR_SUPPORT_CONTEXT_HPP
#define SHARE_JFR_SUPPORT_CONTEXT_HPP

#include "memory/allStatic.hpp"
#include "utilities/globalDefinitions.hpp"

class JfrContext : AllStatic {
private:
static uint8_t _size;
public:
static void set_used_context_size(uint8_t size);
static inline uint8_t get_used_context_size() { return _size; }
static uint64_t get_and_set_context(uint8_t idx, uint64_t value);
static uint8_t get_all_context(uint64_t* data, uint8_t length);
static uint8_t set_all_context(uint64_t* data, uint8_t length);
static uint8_t get_context(uint64_t** data);
static void* get_thread_context_buffer();
};

#endif // SHARE_JFR_SUPPORT_CONTEXT_HPP
Loading