src/share/vm/services/threadService.hpp

Print this page
rev 5644 : imported patch 8027630-stackframeinfo

@@ -111,10 +111,11 @@
 
   static DeadlockCycle*       find_deadlocks_at_safepoint(bool object_monitors_only);
 
   // GC support
   static void   oops_do(OopClosure* f);
+  static void   metadata_do(void f(Metadata*));
 };
 
 // Per-thread Statistics for synchronization
 class ThreadStatistics : public CHeapObj<mtInternal> {
 private:

@@ -240,10 +241,11 @@
   ThreadConcurrentLocks* get_concurrent_locks()     { return _concurrent_locks; }
 
   void        dump_stack_at_safepoint(int max_depth, bool with_locked_monitors);
   void        set_concurrent_locks(ThreadConcurrentLocks* l) { _concurrent_locks = l; }
   void        oops_do(OopClosure* f);
+  void        metadata_do(void f(Metadata*));
 };
 
 class ThreadStackTrace : public CHeapObj<mtInternal> {
  private:
   JavaThread*                     _thread;

@@ -263,10 +265,11 @@
 
   void            add_stack_frame(javaVFrame* jvf);
   void            dump_stack_at_safepoint(int max_depth);
   Handle          allocate_fill_stack_trace_element_array(TRAPS);
   void            oops_do(OopClosure* f);
+  void            metadata_do(void f(Metadata*));
   GrowableArray<oop>* jni_locked_monitors() { return _jni_locked_monitors; }
   int             num_jni_locked_monitors() { return (_jni_locked_monitors != NULL ? _jni_locked_monitors->length() : 0); }
 
   bool            is_owned_monitor_on_stack(oop object);
   void            add_jni_locked_monitor(oop object) { _jni_locked_monitors->append(object); }

@@ -278,10 +281,13 @@
 class StackFrameInfo : public CHeapObj<mtInternal> {
  private:
   Method*             _method;
   int                 _bci;
   GrowableArray<oop>* _locked_monitors; // list of object monitors locked by this frame
+  // We need to save the mirrors in the backtrace to keep the class
+  // from being unloaded while we still have this stack trace.
+  oop                 _class_holder;
 
  public:
 
   StackFrameInfo(javaVFrame* jvf, bool with_locked_monitors);
   ~StackFrameInfo() {

@@ -290,10 +296,11 @@
     }
   };
   Method* method() const       { return _method; }
   int       bci()    const       { return _bci; }
   void      oops_do(OopClosure* f);
+  void      metadata_do(void f(Metadata*));
 
   int       num_locked_monitors()       { return (_locked_monitors != NULL ? _locked_monitors->length() : 0); }
   GrowableArray<oop>* locked_monitors() { return _locked_monitors; }
 
   void      print_on(outputStream* st) const;

@@ -352,10 +359,11 @@
   ThreadDumpResult*    next()                           { return _next; }
   int                  num_threads()                    { return _num_threads; }
   int                  num_snapshots()                  { return _num_snapshots; }
   ThreadSnapshot*      snapshots()                      { return _snapshots; }
   void                 oops_do(OopClosure* f);
+  void                 metadata_do(void f(Metadata*));
 };
 
 class DeadlockCycle : public CHeapObj<mtInternal> {
  private:
   bool _is_deadlock;