OpenJDK / bsd-port / jdk9 / hotspot
changeset 11244:2b2cc4a01fda
Merge
author | dsamersoff |
---|---|
date | Tue, 10 May 2016 14:26:31 +0000 |
parents | 62e86ede0bf0 ae70ccde5447 |
children | 8e3c3195f07f 137319683e94 |
files | |
diffstat | 3 files changed, 33 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/ui/JavaThreadsPanel.java Tue May 10 11:50:45 2016 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/ui/JavaThreadsPanel.java Tue May 10 14:26:31 2016 +0000 @@ -39,6 +39,7 @@ import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.ui.action.*; @@ -55,9 +56,19 @@ private JavaThreadsTableModel dataModel; private StatusBar statusBar; private JTable threadTable; - private java.util.List cachedThreads = new ArrayList(); + private java.util.List<CachedThread> cachedThreads = new ArrayList(); + private static AddressField crashThread; + static { + VM.registerVMInitializedObserver( + (o, a) -> initialize(VM.getVM().getTypeDataBase())); + } + + private static void initialize(TypeDataBase db) { + crashThread = db.lookupType("VMError").getAddressField("_thread"); + } + /** Constructor assumes the threads panel is created while the VM is suspended. Subsequent resume and suspend operations of the VM will cause the threads panel to clear and fill itself back in, @@ -437,21 +448,14 @@ * @return a flag which indicates if crashes were encountered. */ private boolean fireShowThreadCrashes() { - boolean crash = false; - for (Iterator iter = cachedThreads.iterator(); iter.hasNext(); ) { - JavaThread t = (JavaThread) ((CachedThread) iter.next()).getThread(); - sun.jvm.hotspot.runtime.Frame tmpFrame = t.getCurrentFrameGuess(); - RegisterMap tmpMap = t.newRegisterMap(false); - while ((tmpFrame != null) && (!tmpFrame.isFirstFrame())) { - if (tmpFrame.isSignalHandlerFrameDbg()) { - showThreadStackMemory(t); - crash = true; - break; - } - tmpFrame = tmpFrame.sender(tmpMap); - } - } - return crash; + Optional<JavaThread> crashed = + cachedThreads.stream() + .map(t -> t.getThread()) + .filter(t -> t.getAddress().equals( + crashThread.getValue())) + .findAny(); + crashed.ifPresent(this::showThreadStackMemory); + return crashed.isPresent(); } private void cache() {
--- a/src/share/vm/runtime/vmStructs.cpp Tue May 10 11:50:45 2016 +0000 +++ b/src/share/vm/runtime/vmStructs.cpp Tue May 10 14:26:31 2016 +0000 @@ -1365,6 +1365,12 @@ static_field(java_lang_Class, _oop_size_offset, int) \ static_field(java_lang_Class, _static_oop_field_count_offset, int) \ \ + /******************/ \ + /* VMError fields */ \ + /******************/ \ + \ + static_field(VMError, _thread, Thread*) \ + \ /************************/ \ /* Miscellaneous fields */ \ /************************/ \ @@ -2215,6 +2221,12 @@ \ declare_toplevel_type(Arguments) \ \ + /***********/ \ + /* VMError */ \ + /***********/ \ + \ + declare_toplevel_type(VMError) \ + \ /***************/ \ /* Other types */ \ /***************/ \
--- a/src/share/vm/utilities/vmError.hpp Tue May 10 11:50:45 2016 +0000 +++ b/src/share/vm/utilities/vmError.hpp Tue May 10 14:26:31 2016 +0000 @@ -33,6 +33,7 @@ class VMError : public AllStatic { friend class VM_ReportJavaOutOfMemory; friend class Decoder; + friend class VMStructs; static int _id; // Solaris/Linux signals: 0 - SIGRTMAX // Windows exceptions: 0xCxxxxxxx system errors