< prev index next >

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

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 445,454 **** --- 445,478 ---- static jlong get_monotonic_ms() { return os::javaTimeNanos() / 1000000; } + // calculate next sleep period so that it doesn't overflow + static jlong calc_next(jlong interval, jlong last_ms, jlong now_ms) { + assert(last_ms > 0, "invariant"); + + jlong time_diff = last_ms - now_ms; + jlong next; + if (interval == 0) { + next = (time_diff < 0) ? (max_jlong + time_diff) : max_jlong; + } else { + jlong max_v = MAX2<jlong>(interval, 10); + + if (time_diff > 0) { + if (max_v <= (max_jlong - time_diff)) { + next = max_v + time_diff; + } else { + next = max_jlong; + } + } else { + next = max_v + time_diff; + } + } + return next; + } + void JfrThreadSampler::run() { assert(_sampler_thread == NULL, "invariant"); _sampler_thread = this;
*** 460,476 **** _sample.wait(); last_java_ms = get_monotonic_ms(); last_native_ms = last_java_ms; } _sample.signal(); - jlong java_interval = _interval_java == 0 ? max_jlong : MAX2<jlong>(_interval_java, 10); - jlong native_interval = _interval_native == 0 ? max_jlong : MAX2<jlong>(_interval_native, 10); - jlong now_ms = get_monotonic_ms(); ! jlong next_j = java_interval + last_java_ms - now_ms; ! jlong next_n = native_interval + last_native_ms - now_ms; jlong sleep_to_next = MIN2<jlong>(next_j, next_n); if (sleep_to_next > 0) { os::naked_short_sleep(sleep_to_next); --- 484,497 ---- _sample.wait(); last_java_ms = get_monotonic_ms(); last_native_ms = last_java_ms; } _sample.signal(); jlong now_ms = get_monotonic_ms(); ! jlong next_j = calc_next(_interval_java, last_java_ms, now_ms); ! jlong next_n = calc_next(_interval_native, last_native_ms, now_ms); jlong sleep_to_next = MIN2<jlong>(next_j, next_n); if (sleep_to_next > 0) { os::naked_short_sleep(sleep_to_next);
< prev index next >