Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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) {
Expand All @@ -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);
}
Expand All @@ -207,9 +216,15 @@ private Collection<Engine> getAllEngineInstances() {
try {
if (Engine_findActiveEngines == null) {
Collection<Engine> 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ private static Collection<ClassLoader> 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;
}
Expand Down