From 159bbc1c4b2cef6dc8d605e461d50db5e3e55af9 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Sat, 7 Mar 2026 06:18:10 +0100 Subject: [PATCH] Adjusting Polyglot Sampler to GR-54300 --- .../sampler/truffle/stagent/Truffle.java | 31 ++++++++++++++----- .../truffle/stagent/TruffleClassLoader.java | 2 +- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/Truffle.java b/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/Truffle.java index 41adcc155b..f9507b92c4 100644 --- a/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/Truffle.java +++ b/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/Truffle.java @@ -32,6 +32,7 @@ import com.oracle.truffle.tools.profiler.StackTraceEntry; import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; +import java.lang.ref.Reference; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -41,6 +42,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.graalvm.polyglot.Engine; @@ -56,7 +58,7 @@ public class Truffle implements TruffleMBean { private ThreadMXBean threadBean; private Method Engine_findActiveEngines; - private Map engines; + private Set engines; private Unsafe unsafe; private boolean trackFlags; @@ -165,8 +167,8 @@ private Method getFindActiveEngines() { return null; } - private Map getEngines() { - Map engines = null; + private Set getEngines() { + Set engines = null; try { engines = getEnginesFromClass(Engine.class); if (engines == null) { @@ -181,22 +183,29 @@ private Map getEngines() { return engines; } - private Map getEnginesFromClass(Class engineClass) { + private Set getEnginesFromClass(Class engineClass) { try { Field f = engineClass.getDeclaredField("ENGINES"); - return getEnginesFromField(f); + Object v = getEnginesFromField(f); + if (v instanceof Set) { + return (Set) v; + } else { + return ((Map) v).keySet(); + } } catch (NoSuchFieldException ex) { Logger.getLogger(Truffle.class.getName()).log(TruffleJMX.DEBUG ? Level.INFO : Level.FINE, null, ex); + } catch (ClassCastException ex) { + Logger.getLogger(Truffle.class.getName()).log(Level.SEVERE, null, ex); } catch (SecurityException ex) { Logger.getLogger(Truffle.class.getName()).log(Level.SEVERE, null, ex); } return null; } - private Map getEnginesFromField(Field f) { + private Object getEnginesFromField(Field f) { try { Object base = unsafe.staticFieldBase(f); - return (Map) unsafe.getObject(base, unsafe.staticFieldOffset(f)); + return unsafe.getObject(base, unsafe.staticFieldOffset(f)); } catch (SecurityException ex) { Logger.getLogger(Truffle.class.getName()).log(Level.SEVERE, null, ex); } @@ -207,9 +216,15 @@ private Collection getAllEngineInstances() { try { if (Engine_findActiveEngines == null) { Collection en = new ArrayList(); - for (Object o : engines.keySet()) { + for (Object o : engines) { Engine e; + if (o instanceof Reference) { + o = ((Reference)o).get(); + } + if (o == null) { + continue; + } if (o instanceof Engine) { e = (Engine) o; } else { diff --git a/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/TruffleClassLoader.java b/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/TruffleClassLoader.java index b8fa58a276..08c484ec40 100644 --- a/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/TruffleClassLoader.java +++ b/visualvm/sampler.truffle/libsrc/org/graalvm/visualvm/sampler/truffle/stagent/TruffleClassLoader.java @@ -98,7 +98,7 @@ private static Collection getGraalVMLocatorLoaders(ClassLoader cl, ClassLoader loader = (ClassLoader) unsafe.getObject(base, unsafe.staticFieldOffset(f)); return Collections.singletonList(loader); } catch (Exception ex) { - Logger.getLogger(TruffleClassLoader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(TruffleClassLoader.class.getName()).log(Level.FINE, null, ex); } return null; }