8295223: JFR: At most one native periodic event thread at a time
Reviewed-by: mgronlun
This commit is contained in:
parent
7e4868de7b
commit
c7f65438bb
@ -237,7 +237,11 @@ public final class PlatformEventType extends Type {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEveryChunk() {
|
/**
|
||||||
|
* Returns true if "beginChunk", "endChunk" or "everyChunk" have
|
||||||
|
* been set.
|
||||||
|
*/
|
||||||
|
public boolean isChunkTime() {
|
||||||
return period == 0;
|
return period == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import jdk.jfr.Event;
|
import jdk.jfr.Event;
|
||||||
import jdk.jfr.EventType;
|
import jdk.jfr.EventType;
|
||||||
@ -40,6 +41,7 @@ import jdk.jfr.EventType;
|
|||||||
public final class RequestEngine {
|
public final class RequestEngine {
|
||||||
|
|
||||||
private static final JVM jvm = JVM.getJVM();
|
private static final JVM jvm = JVM.getJVM();
|
||||||
|
private static final ReentrantLock lock = new ReentrantLock();
|
||||||
|
|
||||||
static final class RequestHook {
|
static final class RequestHook {
|
||||||
private final Runnable hook;
|
private final Runnable hook;
|
||||||
@ -66,7 +68,7 @@ public final class RequestEngine {
|
|||||||
if (type.isJDK()) {
|
if (type.isJDK()) {
|
||||||
hook.run();
|
hook.run();
|
||||||
} else {
|
} else {
|
||||||
jvm.emitEvent(type.getId(), JVM.counterTime(), 0);
|
emitJVMEvent(type);
|
||||||
}
|
}
|
||||||
if (Logger.shouldLog(LogTag.JFR_SYSTEM, LogLevel.DEBUG)) {
|
if (Logger.shouldLog(LogTag.JFR_SYSTEM, LogLevel.DEBUG)) {
|
||||||
Logger.log(LogTag.JFR_SYSTEM, LogLevel.DEBUG, "Executed periodic hook for " + type.getLogName());
|
Logger.log(LogTag.JFR_SYSTEM, LogLevel.DEBUG, "Executed periodic hook for " + type.getLogName());
|
||||||
@ -80,6 +82,18 @@ public final class RequestEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void emitJVMEvent(PlatformEventType type) {
|
||||||
|
try {
|
||||||
|
// There should only be one thread in native at a time.
|
||||||
|
// ReentrantLock is used to avoid JavaMonitorBlocked event
|
||||||
|
// from synchronized block.
|
||||||
|
lock.lock();
|
||||||
|
jvm.emitEvent(type.getId(), JVM.counterTime(), 0);
|
||||||
|
} finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("removal")
|
@SuppressWarnings("removal")
|
||||||
private void executeSecure() {
|
private void executeSecure() {
|
||||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||||
@ -221,7 +235,7 @@ public final class RequestEngine {
|
|||||||
long left = 0;
|
long left = 0;
|
||||||
PlatformEventType es = he.type;
|
PlatformEventType es = he.type;
|
||||||
// Not enabled, skip.
|
// Not enabled, skip.
|
||||||
if (!es.isEnabled() || es.isEveryChunk()) {
|
if (!es.isEnabled() || es.isChunkTime()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
long r_period = es.getPeriod();
|
long r_period = es.getPeriod();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user