Skip to content
This repository was archived by the owner on Sep 19, 2023. It is now read-only.
/ jdk19 Public archive

Commit 0408f9c

Browse files
author
Markus Grönlund
committedJun 20, 2022
8288663: JFR: Disabling the JfrThreadSampler commits only a partially disabled state
Backport-of: a7df5a4
1 parent 1cf83a4 commit 0408f9c

File tree

7 files changed

+103
-75
lines changed

7 files changed

+103
-75
lines changed
 

‎src/hotspot/share/jfr/jni/jfrJniMethod.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -271,19 +271,19 @@ JVM_ENTRY_NO_ENV(void, jfr_set_output(JNIEnv* env, jobject jvm, jstring path))
271271
JfrRepository::set_chunk_path(path, thread);
272272
JVM_END
273273

274-
JVM_ENTRY_NO_ENV(void, jfr_set_method_sampling_interval(JNIEnv* env, jobject jvm, jlong type, jlong intervalMillis))
275-
if (intervalMillis < 0) {
276-
intervalMillis = 0;
274+
JVM_ENTRY_NO_ENV(void, jfr_set_method_sampling_period(JNIEnv* env, jobject jvm, jlong type, jlong periodMillis))
275+
if (periodMillis < 0) {
276+
periodMillis = 0;
277277
}
278278
JfrEventId typed_event_id = (JfrEventId)type;
279279
assert(EventExecutionSample::eventId == typed_event_id || EventNativeMethodSample::eventId == typed_event_id, "invariant");
280-
if (intervalMillis > 0) {
280+
if (periodMillis > 0) {
281281
JfrEventSetting::set_enabled(typed_event_id, true); // ensure sampling event is enabled
282282
}
283283
if (EventExecutionSample::eventId == type) {
284-
JfrThreadSampling::set_java_sample_interval(intervalMillis);
284+
JfrThreadSampling::set_java_sample_period(periodMillis);
285285
} else {
286-
JfrThreadSampling::set_native_sample_interval(intervalMillis);
286+
JfrThreadSampling::set_native_sample_period(periodMillis);
287287
}
288288
JVM_END
289289

‎src/hotspot/share/jfr/jni/jfrJniMethod.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ void JNICALL jfr_set_global_buffer_count(JNIEnv* env, jobject jvm, jlong count);
8383

8484
void JNICALL jfr_set_global_buffer_size(JNIEnv* env, jobject jvm, jlong size);
8585

86-
void JNICALL jfr_set_method_sampling_interval(JNIEnv* env, jobject jvm, jlong type, jlong intervalMillis);
86+
void JNICALL jfr_set_method_sampling_period(JNIEnv* env, jobject jvm, jlong type, jlong periodMillis);
8787

8888
void JNICALL jfr_set_output(JNIEnv* env, jobject jvm, jstring path);
8989

‎src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) {
5757
(char*)"setFileNotification", (char*)"(J)V", (void*)jfr_set_file_notification,
5858
(char*)"setGlobalBufferCount", (char*)"(J)V", (void*)jfr_set_global_buffer_count,
5959
(char*)"setGlobalBufferSize", (char*)"(J)V", (void*)jfr_set_global_buffer_size,
60-
(char*)"setMethodSamplingInterval", (char*)"(JJ)V", (void*)jfr_set_method_sampling_interval,
60+
(char*)"setMethodSamplingPeriod", (char*)"(JJ)V", (void*)jfr_set_method_sampling_period,
6161
(char*)"setOutput", (char*)"(Ljava/lang/String;)V", (void*)jfr_set_output,
6262
(char*)"setStackDepth", (char*)"(I)V", (void*)jfr_set_stack_depth,
6363
(char*)"setStackTraceEnabled", (char*)"(JZ)V", (void*)jfr_set_stacktrace_enabled,

‎src/hotspot/share/jfr/periodic/sampling/jfrThreadSampler.cpp

+83-53
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,8 @@ class JfrThreadSampler : public NonJavaThread {
322322
JfrStackFrame* const _frames;
323323
JavaThread* _last_thread_java;
324324
JavaThread* _last_thread_native;
325-
size_t _interval_java;
326-
size_t _interval_native;
325+
int64_t _java_period_millis;
326+
int64_t _native_period_millis;
327327
const size_t _min_size; // for enqueue buffer monitoring
328328
const size_t _renew_size;
329329
int _cur_index;
@@ -335,17 +335,15 @@ class JfrThreadSampler : public NonJavaThread {
335335

336336
JavaThread* next_thread(ThreadsList* t_list, JavaThread* first_sampled, JavaThread* current);
337337
void task_stacktrace(JfrSampleType type, JavaThread** last_thread);
338-
JfrThreadSampler(size_t interval_java, size_t interval_native, u4 max_frames);
338+
JfrThreadSampler(int64_t java_period_millis, int64_t native_period_millis, u4 max_frames);
339339
~JfrThreadSampler();
340340

341341
void start_thread();
342342

343343
void enroll();
344344
void disenroll();
345-
void set_java_interval(size_t interval) { _interval_java = interval; };
346-
void set_native_interval(size_t interval) { _interval_native = interval; };
347-
size_t get_java_interval() { return _interval_java; };
348-
size_t get_native_interval() { return _interval_native; };
345+
void set_java_period(int64_t period_millis);
346+
void set_native_period(int64_t period_millis);
349347
protected:
350348
virtual void post_run();
351349
public:
@@ -355,6 +353,8 @@ class JfrThreadSampler : public NonJavaThread {
355353
void run();
356354
static Monitor* transition_block() { return JfrThreadSampler_lock; }
357355
static void on_javathread_suspend(JavaThread* thread);
356+
int64_t get_java_period() const { return _java_period_millis; };
357+
int64_t get_native_period() const { return _native_period_millis; };
358358
};
359359

360360
static void clear_transition_block(JavaThread* jt) {
@@ -394,25 +394,37 @@ bool JfrThreadSampleClosure::do_sample_thread(JavaThread* thread, JfrStackFrame*
394394
return ret;
395395
}
396396

397-
JfrThreadSampler::JfrThreadSampler(size_t interval_java, size_t interval_native, u4 max_frames) :
397+
JfrThreadSampler::JfrThreadSampler(int64_t java_period_millis, int64_t native_period_millis, u4 max_frames) :
398398
_sample(),
399399
_sampler_thread(NULL),
400400
_frames(JfrCHeapObj::new_array<JfrStackFrame>(max_frames)),
401401
_last_thread_java(NULL),
402402
_last_thread_native(NULL),
403-
_interval_java(interval_java),
404-
_interval_native(interval_native),
403+
_java_period_millis(java_period_millis),
404+
_native_period_millis(native_period_millis),
405405
_min_size(JfrOptionSet::stackdepth() * sizeof(intptr_t)),
406406
_renew_size(_min_size * 2),
407407
_cur_index(-1),
408408
_max_frames(max_frames),
409409
_disenrolled(true) {
410+
assert(_java_period_millis >= 0, "invariant");
411+
assert(_native_period_millis >= 0, "invariant");
410412
}
411413

412414
JfrThreadSampler::~JfrThreadSampler() {
413415
JfrCHeapObj::free(_frames, sizeof(JfrStackFrame) * _max_frames);
414416
}
415417

418+
void JfrThreadSampler::set_java_period(int64_t period_millis) {
419+
assert(period_millis >= 0, "invariant");
420+
_java_period_millis = period_millis;
421+
}
422+
423+
void JfrThreadSampler::set_native_period(int64_t period_millis) {
424+
assert(period_millis >= 0, "invariant");
425+
_native_period_millis = period_millis;
426+
}
427+
416428
static inline bool is_released(JavaThread* jt) {
417429
return !jt->is_trace_suspend();
418430
}
@@ -470,7 +482,7 @@ void JfrThreadSampler::disenroll() {
470482
}
471483
}
472484

473-
static jlong get_monotonic_ms() {
485+
static int64_t get_monotonic_ms() {
474486
return os::javaTimeNanos() / 1000000;
475487
}
476488

@@ -479,8 +491,8 @@ void JfrThreadSampler::run() {
479491

480492
_sampler_thread = this;
481493

482-
jlong last_java_ms = get_monotonic_ms();
483-
jlong last_native_ms = last_java_ms;
494+
int64_t last_java_ms = get_monotonic_ms();
495+
int64_t last_native_ms = last_java_ms;
484496
while (true) {
485497
if (!_sample.trywait()) {
486498
// disenrolled
@@ -489,24 +501,24 @@ void JfrThreadSampler::run() {
489501
last_native_ms = last_java_ms;
490502
}
491503
_sample.signal();
492-
jlong java_interval = _interval_java == 0 ? max_jlong : MAX2<jlong>(_interval_java, 1);
493-
jlong native_interval = _interval_native == 0 ? max_jlong : MAX2<jlong>(_interval_native, 1);
504+
const int64_t java_period_millis = _java_period_millis == 0 ? max_jlong : MAX2<int64_t>(_java_period_millis, 1);
505+
const int64_t native_period_millis = _native_period_millis == 0 ? max_jlong : MAX2<int64_t>(_native_period_millis, 1);
494506

495-
jlong now_ms = get_monotonic_ms();
507+
const int64_t now_ms = get_monotonic_ms();
496508

497509
/*
498-
* Let I be java_interval or native_interval.
510+
* Let I be java_period or native_period.
499511
* Let L be last_java_ms or last_native_ms.
500512
* Let N be now_ms.
501513
*
502514
* Interval, I, might be max_jlong so the addition
503515
* could potentially overflow without parenthesis (UB). Also note that
504516
* L - N < 0. Avoid UB, by adding parenthesis.
505517
*/
506-
jlong next_j = java_interval + (last_java_ms - now_ms);
507-
jlong next_n = native_interval + (last_native_ms - now_ms);
518+
const int64_t next_j = java_period_millis + (last_java_ms - now_ms);
519+
const int64_t next_n = native_period_millis + (last_native_ms - now_ms);
508520

509-
jlong sleep_to_next = MIN2<jlong>(next_j, next_n);
521+
const int64_t sleep_to_next = MIN2<int64_t>(next_j, next_n);
510522

511523
if (sleep_to_next > 0) {
512524
os::naked_short_sleep(sleep_to_next);
@@ -622,58 +634,76 @@ JfrThreadSampling::~JfrThreadSampling() {
622634
}
623635
}
624636

625-
static void log(size_t interval_java, size_t interval_native) {
626-
log_trace(jfr)("Updated thread sampler for java: " SIZE_FORMAT " ms, native " SIZE_FORMAT " ms", interval_java, interval_native);
637+
#ifdef ASSERT
638+
void assert_periods(const JfrThreadSampler* sampler, int64_t java_period_millis, int64_t native_period_millis) {
639+
assert(sampler != nullptr, "invariant");
640+
assert(sampler->get_java_period() == java_period_millis, "invariant");
641+
assert(sampler->get_native_period() == native_period_millis, "invariant");
642+
}
643+
#endif
644+
645+
static void log(int64_t java_period_millis, int64_t native_period_millis) {
646+
log_trace(jfr)("Updated thread sampler for java: " INT64_FORMAT " ms, native " INT64_FORMAT " ms", java_period_millis, native_period_millis);
627647
}
628648

629-
void JfrThreadSampling::start_sampler(size_t interval_java, size_t interval_native) {
630-
assert(_sampler == NULL, "invariant");
631-
log_trace(jfr)("Enrolling thread sampler");
632-
_sampler = new JfrThreadSampler(interval_java, interval_native, JfrOptionSet::stackdepth());
649+
void JfrThreadSampling::create_sampler(int64_t java_period_millis, int64_t native_period_millis) {
650+
assert(_sampler == nullptr, "invariant");
651+
log_trace(jfr)("Creating thread sampler for java:" INT64_FORMAT " ms, native " INT64_FORMAT " ms", java_period_millis, native_period_millis);
652+
_sampler = new JfrThreadSampler(java_period_millis, native_period_millis, JfrOptionSet::stackdepth());
633653
_sampler->start_thread();
634654
_sampler->enroll();
635655
}
636656

637-
void JfrThreadSampling::set_sampling_interval(bool java_interval, size_t period) {
638-
size_t interval_java = 0;
639-
size_t interval_native = 0;
640-
if (_sampler != NULL) {
641-
interval_java = _sampler->get_java_interval();
642-
interval_native = _sampler->get_native_interval();
643-
}
644-
if (java_interval) {
645-
interval_java = period;
646-
} else {
647-
interval_native = period;
648-
}
649-
if (interval_java > 0 || interval_native > 0) {
650-
if (_sampler == NULL) {
651-
log_trace(jfr)("Creating thread sampler for java:%zu ms, native %zu ms", interval_java, interval_native);
652-
start_sampler(interval_java, interval_native);
657+
void JfrThreadSampling::update_run_state(int64_t java_period_millis, int64_t native_period_millis) {
658+
if (java_period_millis > 0 || native_period_millis > 0) {
659+
if (_sampler == nullptr) {
660+
create_sampler(java_period_millis, native_period_millis);
653661
} else {
654-
_sampler->set_java_interval(interval_java);
655-
_sampler->set_native_interval(interval_native);
656662
_sampler->enroll();
657663
}
658-
assert(_sampler != NULL, "invariant");
659-
log(interval_java, interval_native);
660-
} else if (_sampler != NULL) {
664+
DEBUG_ONLY(assert_periods(_sampler, java_period_millis, native_period_millis);)
665+
log(java_period_millis, native_period_millis);
666+
return;
667+
}
668+
if (_sampler != nullptr) {
669+
DEBUG_ONLY(assert_periods(_sampler, java_period_millis, native_period_millis);)
661670
_sampler->disenroll();
662671
}
663672
}
664673

665-
void JfrThreadSampling::set_java_sample_interval(size_t period) {
666-
if (_instance == NULL && 0 == period) {
674+
void JfrThreadSampling::set_sampling_period(bool is_java_period, int64_t period_millis) {
675+
int64_t java_period_millis = 0;
676+
int64_t native_period_millis = 0;
677+
if (is_java_period) {
678+
java_period_millis = period_millis;
679+
if (_sampler != nullptr) {
680+
_sampler->set_java_period(java_period_millis);
681+
native_period_millis = _sampler->get_native_period();
682+
}
683+
} else {
684+
native_period_millis = period_millis;
685+
if (_sampler != nullptr) {
686+
_sampler->set_native_period(native_period_millis);
687+
java_period_millis = _sampler->get_java_period();
688+
}
689+
}
690+
update_run_state(java_period_millis, native_period_millis);
691+
}
692+
693+
void JfrThreadSampling::set_java_sample_period(int64_t period_millis) {
694+
assert(period_millis >= 0, "invariant");
695+
if (_instance == NULL && 0 == period_millis) {
667696
return;
668697
}
669-
instance().set_sampling_interval(true, period);
698+
instance().set_sampling_period(true, period_millis);
670699
}
671700

672-
void JfrThreadSampling::set_native_sample_interval(size_t period) {
673-
if (_instance == NULL && 0 == period) {
701+
void JfrThreadSampling::set_native_sample_period(int64_t period_millis) {
702+
assert(period_millis >= 0, "invariant");
703+
if (_instance == NULL && 0 == period_millis) {
674704
return;
675705
}
676-
instance().set_sampling_interval(false, period);
706+
instance().set_sampling_period(false, period_millis);
677707
}
678708

679709
void JfrThreadSampling::on_javathread_suspend(JavaThread* thread) {

‎src/hotspot/share/jfr/periodic/sampling/jfrThreadSampler.hpp

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -28,17 +28,15 @@
2828
#include "jfr/utilities/jfrAllocation.hpp"
2929

3030
class JavaThread;
31-
class JfrBuffer;
32-
class JfrStackFrame;
3331
class JfrThreadSampler;
34-
class Thread;
3532

3633
class JfrThreadSampling : public JfrCHeapObj {
3734
friend class JfrRecorder;
3835
private:
3936
JfrThreadSampler* _sampler;
40-
void start_sampler(size_t interval_java, size_t interval_native);
41-
void set_sampling_interval(bool java_interval, size_t period);
37+
void create_sampler(int64_t java_period_millis, int64_t native_period_millis);
38+
void update_run_state(int64_t java_period_millis, int64_t native_period_millis);
39+
void set_sampling_period(bool is_java_period, int64_t period_millis);
4240

4341
JfrThreadSampling();
4442
~JfrThreadSampling();
@@ -48,8 +46,8 @@ class JfrThreadSampling : public JfrCHeapObj {
4846
static void destroy();
4947

5048
public:
51-
static void set_java_sample_interval(size_t period);
52-
static void set_native_sample_interval(size_t period);
49+
static void set_java_sample_period(int64_t period_millis);
50+
static void set_native_sample_period(int64_t period_millis);
5351
static void on_javathread_suspend(JavaThread* thread);
5452
};
5553

‎src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -261,13 +261,13 @@ private JVM() {
261261
public native void setMemorySize(long size) throws IllegalArgumentException;
262262

263263
/**
264-
* Set interval for method samples, in milliseconds.
264+
* Set period for method samples, in milliseconds.
265265
*
266-
* Setting interval to 0 turns off the method sampler.
266+
* Setting period to 0 turns off the method sampler.
267267
*
268-
* @param intervalMillis the sampling interval
268+
* @param periodMillis the sampling period
269269
*/
270-
public native void setMethodSamplingInterval(long type, long intervalMillis);
270+
public native void setMethodSamplingPeriod(long type, long periodMillis);
271271

272272
/**
273273
* Sets the file where data should be written.

‎src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformEventType.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public void setEnabled(boolean enabled) {
206206
if (isJVM) {
207207
if (isMethodSampling) {
208208
long p = enabled ? period : 0;
209-
JVM.getJVM().setMethodSamplingInterval(getId(), p);
209+
JVM.getJVM().setMethodSamplingPeriod(getId(), p);
210210
} else {
211211
JVM.getJVM().setEnabled(getId(), enabled);
212212
}
@@ -216,7 +216,7 @@ public void setEnabled(boolean enabled) {
216216
public void setPeriod(long periodMillis, boolean beginChunk, boolean endChunk) {
217217
if (isMethodSampling) {
218218
long p = enabled ? periodMillis : 0;
219-
JVM.getJVM().setMethodSamplingInterval(getId(), p);
219+
JVM.getJVM().setMethodSamplingPeriod(getId(), p);
220220
}
221221
this.beginChunk = beginChunk;
222222
this.endChunk = endChunk;

1 commit comments

Comments
 (1)

openjdk-notifier[bot] commented on Jun 20, 2022

@openjdk-notifier[bot]
This repository has been archived.