@@ -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
360360static 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
412414JfrThreadSampler::~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+
416428static 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
679709void JfrThreadSampling::on_javathread_suspend (JavaThread* thread) {
0 commit comments