@@ -322,8 +322,8 @@ class JfrThreadSampler : public NonJavaThread {
322
322
JfrStackFrame* const _frames;
323
323
JavaThread* _last_thread_java;
324
324
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 ;
327
327
const size_t _min_size; // for enqueue buffer monitoring
328
328
const size_t _renew_size;
329
329
int _cur_index;
@@ -335,17 +335,15 @@ class JfrThreadSampler : public NonJavaThread {
335
335
336
336
JavaThread* next_thread (ThreadsList* t_list, JavaThread* first_sampled, JavaThread* current);
337
337
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);
339
339
~JfrThreadSampler ();
340
340
341
341
void start_thread ();
342
342
343
343
void enroll ();
344
344
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);
349
347
protected:
350
348
virtual void post_run ();
351
349
public:
@@ -355,6 +353,8 @@ class JfrThreadSampler : public NonJavaThread {
355
353
void run ();
356
354
static Monitor* transition_block () { return JfrThreadSampler_lock; }
357
355
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; };
358
358
};
359
359
360
360
static void clear_transition_block (JavaThread* jt) {
@@ -394,25 +394,37 @@ bool JfrThreadSampleClosure::do_sample_thread(JavaThread* thread, JfrStackFrame*
394
394
return ret;
395
395
}
396
396
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) :
398
398
_sample(),
399
399
_sampler_thread(NULL ),
400
400
_frames(JfrCHeapObj::new_array<JfrStackFrame>(max_frames)),
401
401
_last_thread_java(NULL ),
402
402
_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 ),
405
405
_min_size(JfrOptionSet::stackdepth() * sizeof(intptr_t )),
406
406
_renew_size(_min_size * 2 ),
407
407
_cur_index(-1 ),
408
408
_max_frames(max_frames),
409
409
_disenrolled(true ) {
410
+ assert (_java_period_millis >= 0 , " invariant" );
411
+ assert (_native_period_millis >= 0 , " invariant" );
410
412
}
411
413
412
414
JfrThreadSampler::~JfrThreadSampler () {
413
415
JfrCHeapObj::free (_frames, sizeof (JfrStackFrame) * _max_frames);
414
416
}
415
417
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
+
416
428
static inline bool is_released (JavaThread* jt) {
417
429
return !jt->is_trace_suspend ();
418
430
}
@@ -470,7 +482,7 @@ void JfrThreadSampler::disenroll() {
470
482
}
471
483
}
472
484
473
- static jlong get_monotonic_ms () {
485
+ static int64_t get_monotonic_ms () {
474
486
return os::javaTimeNanos () / 1000000 ;
475
487
}
476
488
@@ -479,8 +491,8 @@ void JfrThreadSampler::run() {
479
491
480
492
_sampler_thread = this ;
481
493
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;
484
496
while (true ) {
485
497
if (!_sample.trywait ()) {
486
498
// disenrolled
@@ -489,24 +501,24 @@ void JfrThreadSampler::run() {
489
501
last_native_ms = last_java_ms;
490
502
}
491
503
_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 );
494
506
495
- jlong now_ms = get_monotonic_ms ();
507
+ const int64_t now_ms = get_monotonic_ms ();
496
508
497
509
/*
498
- * Let I be java_interval or native_interval .
510
+ * Let I be java_period or native_period .
499
511
* Let L be last_java_ms or last_native_ms.
500
512
* Let N be now_ms.
501
513
*
502
514
* Interval, I, might be max_jlong so the addition
503
515
* could potentially overflow without parenthesis (UB). Also note that
504
516
* L - N < 0. Avoid UB, by adding parenthesis.
505
517
*/
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);
508
520
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);
510
522
511
523
if (sleep_to_next > 0 ) {
512
524
os::naked_short_sleep (sleep_to_next);
@@ -622,58 +634,76 @@ JfrThreadSampling::~JfrThreadSampling() {
622
634
}
623
635
}
624
636
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);
627
647
}
628
648
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 ());
633
653
_sampler->start_thread ();
634
654
_sampler->enroll ();
635
655
}
636
656
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);
653
661
} else {
654
- _sampler->set_java_interval (interval_java);
655
- _sampler->set_native_interval (interval_native);
656
662
_sampler->enroll ();
657
663
}
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);)
661
670
_sampler->disenroll ();
662
671
}
663
672
}
664
673
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) {
667
696
return ;
668
697
}
669
- instance ().set_sampling_interval (true , period );
698
+ instance ().set_sampling_period (true , period_millis );
670
699
}
671
700
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) {
674
704
return ;
675
705
}
676
- instance ().set_sampling_interval (false , period );
706
+ instance ().set_sampling_period (false , period_millis );
677
707
}
678
708
679
709
void JfrThreadSampling::on_javathread_suspend (JavaThread* thread) {
1 commit comments
openjdk-notifier[bot] commentedon Jun 20, 2022
Review
Issues