8027630: SIGSEGV in const char*Klass::external_name()

Mon, 18 Nov 2013 10:20:13 +0100

author
sla
date
Mon, 18 Nov 2013 10:20:13 +0100
changeset 6122
0b9ea9a72436
parent 6121
d61a1a166f44
child 6123
396564992823

8027630: SIGSEGV in const char*Klass::external_name()
Reviewed-by: coleenp, sspitsyn, mgronlun

src/share/vm/classfile/metadataOnStackMark.cpp file | annotate | diff | comparison | revisions
src/share/vm/services/threadService.cpp file | annotate | diff | comparison | revisions
src/share/vm/services/threadService.hpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/classfile/metadataOnStackMark.cpp	Fri Nov 15 17:20:22 2013 -0500
     1.2 +++ b/src/share/vm/classfile/metadataOnStackMark.cpp	Mon Nov 18 10:20:13 2013 +0100
     1.3 @@ -30,6 +30,7 @@
     1.4  #include "prims/jvmtiImpl.hpp"
     1.5  #include "runtime/synchronizer.hpp"
     1.6  #include "runtime/thread.hpp"
     1.7 +#include "services/threadService.hpp"
     1.8  #include "utilities/growableArray.hpp"
     1.9  
    1.10  
    1.11 @@ -50,6 +51,7 @@
    1.12    CodeCache::alive_nmethods_do(nmethod::mark_on_stack);
    1.13    CompileBroker::mark_on_stack();
    1.14    JvmtiCurrentBreakpoints::metadata_do(Metadata::mark_on_stack);
    1.15 +  ThreadService::metadata_do(Metadata::mark_on_stack);
    1.16  }
    1.17  
    1.18  MetadataOnStackMark::~MetadataOnStackMark() {
     2.1 --- a/src/share/vm/services/threadService.cpp	Fri Nov 15 17:20:22 2013 -0500
     2.2 +++ b/src/share/vm/services/threadService.cpp	Mon Nov 18 10:20:13 2013 +0100
     2.3 @@ -200,6 +200,12 @@
     2.4    }
     2.5  }
     2.6  
     2.7 +void ThreadService::metadata_do(void f(Metadata*)) {
     2.8 +  for (ThreadDumpResult* dump = _threaddump_list; dump != NULL; dump = dump->next()) {
     2.9 +    dump->metadata_do(f);
    2.10 +  }
    2.11 +}
    2.12 +
    2.13  void ThreadService::add_thread_dump(ThreadDumpResult* dump) {
    2.14    MutexLocker ml(Management_lock);
    2.15    if (_threaddump_list == NULL) {
    2.16 @@ -451,9 +457,16 @@
    2.17    }
    2.18  }
    2.19  
    2.20 +void ThreadDumpResult::metadata_do(void f(Metadata*)) {
    2.21 +  for (ThreadSnapshot* ts = _snapshots; ts != NULL; ts = ts->next()) {
    2.22 +    ts->metadata_do(f);
    2.23 +  }
    2.24 +}
    2.25 +
    2.26  StackFrameInfo::StackFrameInfo(javaVFrame* jvf, bool with_lock_info) {
    2.27    _method = jvf->method();
    2.28    _bci = jvf->bci();
    2.29 +  _class_holder = _method->method_holder()->klass_holder();
    2.30    _locked_monitors = NULL;
    2.31    if (with_lock_info) {
    2.32      ResourceMark rm;
    2.33 @@ -477,6 +490,11 @@
    2.34        f->do_oop((oop*) _locked_monitors->adr_at(i));
    2.35      }
    2.36    }
    2.37 +  f->do_oop(&_class_holder);
    2.38 +}
    2.39 +
    2.40 +void StackFrameInfo::metadata_do(void f(Metadata*)) {
    2.41 +  f(_method);
    2.42  }
    2.43  
    2.44  void StackFrameInfo::print_on(outputStream* st) const {
    2.45 @@ -620,6 +638,14 @@
    2.46    }
    2.47  }
    2.48  
    2.49 +void ThreadStackTrace::metadata_do(void f(Metadata*)) {
    2.50 +  int length = _frames->length();
    2.51 +  for (int i = 0; i < length; i++) {
    2.52 +    _frames->at(i)->metadata_do(f);
    2.53 +  }
    2.54 +}
    2.55 +
    2.56 +
    2.57  ConcurrentLocksDump::~ConcurrentLocksDump() {
    2.58    if (_retain_map_on_free) {
    2.59      return;
    2.60 @@ -823,6 +849,13 @@
    2.61    }
    2.62  }
    2.63  
    2.64 +void ThreadSnapshot::metadata_do(void f(Metadata*)) {
    2.65 +  if (_stack_trace != NULL) {
    2.66 +    _stack_trace->metadata_do(f);
    2.67 +  }
    2.68 +}
    2.69 +
    2.70 +
    2.71  DeadlockCycle::DeadlockCycle() {
    2.72    _is_deadlock = false;
    2.73    _threads = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JavaThread*>(INITIAL_ARRAY_SIZE, true);
     3.1 --- a/src/share/vm/services/threadService.hpp	Fri Nov 15 17:20:22 2013 -0500
     3.2 +++ b/src/share/vm/services/threadService.hpp	Mon Nov 18 10:20:13 2013 +0100
     3.3 @@ -113,6 +113,7 @@
     3.4  
     3.5    // GC support
     3.6    static void   oops_do(OopClosure* f);
     3.7 +  static void   metadata_do(void f(Metadata*));
     3.8  };
     3.9  
    3.10  // Per-thread Statistics for synchronization
    3.11 @@ -242,6 +243,7 @@
    3.12    void        dump_stack_at_safepoint(int max_depth, bool with_locked_monitors);
    3.13    void        set_concurrent_locks(ThreadConcurrentLocks* l) { _concurrent_locks = l; }
    3.14    void        oops_do(OopClosure* f);
    3.15 +  void        metadata_do(void f(Metadata*));
    3.16  };
    3.17  
    3.18  class ThreadStackTrace : public CHeapObj<mtInternal> {
    3.19 @@ -265,6 +267,7 @@
    3.20    void            dump_stack_at_safepoint(int max_depth);
    3.21    Handle          allocate_fill_stack_trace_element_array(TRAPS);
    3.22    void            oops_do(OopClosure* f);
    3.23 +  void            metadata_do(void f(Metadata*));
    3.24    GrowableArray<oop>* jni_locked_monitors() { return _jni_locked_monitors; }
    3.25    int             num_jni_locked_monitors() { return (_jni_locked_monitors != NULL ? _jni_locked_monitors->length() : 0); }
    3.26  
    3.27 @@ -280,6 +283,9 @@
    3.28    Method*             _method;
    3.29    int                 _bci;
    3.30    GrowableArray<oop>* _locked_monitors; // list of object monitors locked by this frame
    3.31 +  // We need to save the mirrors in the backtrace to keep the class
    3.32 +  // from being unloaded while we still have this stack trace.
    3.33 +  oop                 _class_holder;
    3.34  
    3.35   public:
    3.36  
    3.37 @@ -289,9 +295,10 @@
    3.38        delete _locked_monitors;
    3.39      }
    3.40    };
    3.41 -  Method* method() const       { return _method; }
    3.42 +  Method*   method() const       { return _method; }
    3.43    int       bci()    const       { return _bci; }
    3.44    void      oops_do(OopClosure* f);
    3.45 +  void      metadata_do(void f(Metadata*));
    3.46  
    3.47    int       num_locked_monitors()       { return (_locked_monitors != NULL ? _locked_monitors->length() : 0); }
    3.48    GrowableArray<oop>* locked_monitors() { return _locked_monitors; }
    3.49 @@ -354,6 +361,7 @@
    3.50    int                  num_snapshots()                  { return _num_snapshots; }
    3.51    ThreadSnapshot*      snapshots()                      { return _snapshots; }
    3.52    void                 oops_do(OopClosure* f);
    3.53 +  void                 metadata_do(void f(Metadata*));
    3.54  };
    3.55  
    3.56  class DeadlockCycle : public CHeapObj<mtInternal> {

mercurial