Mon, 18 Nov 2013 10:20:13 +0100
8027630: SIGSEGV in const char*Klass::external_name()
Reviewed-by: coleenp, sspitsyn, mgronlun
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> {