comparison src/share/vm/services/threadService.hpp @ 13391:0b9ea9a72436

8027630: SIGSEGV in const char*Klass::external_name() Reviewed-by: coleenp, sspitsyn, mgronlun
author sla
date Mon, 18 Nov 2013 10:20:13 +0100
parents da91efe96a93
children de6a9e811145
comparison
equal deleted inserted replaced
13390:d61a1a166f44 13391:0b9ea9a72436
111 111
112 static DeadlockCycle* find_deadlocks_at_safepoint(bool object_monitors_only); 112 static DeadlockCycle* find_deadlocks_at_safepoint(bool object_monitors_only);
113 113
114 // GC support 114 // GC support
115 static void oops_do(OopClosure* f); 115 static void oops_do(OopClosure* f);
116 static void metadata_do(void f(Metadata*));
116 }; 117 };
117 118
118 // Per-thread Statistics for synchronization 119 // Per-thread Statistics for synchronization
119 class ThreadStatistics : public CHeapObj<mtInternal> { 120 class ThreadStatistics : public CHeapObj<mtInternal> {
120 private: 121 private:
240 ThreadConcurrentLocks* get_concurrent_locks() { return _concurrent_locks; } 241 ThreadConcurrentLocks* get_concurrent_locks() { return _concurrent_locks; }
241 242
242 void dump_stack_at_safepoint(int max_depth, bool with_locked_monitors); 243 void dump_stack_at_safepoint(int max_depth, bool with_locked_monitors);
243 void set_concurrent_locks(ThreadConcurrentLocks* l) { _concurrent_locks = l; } 244 void set_concurrent_locks(ThreadConcurrentLocks* l) { _concurrent_locks = l; }
244 void oops_do(OopClosure* f); 245 void oops_do(OopClosure* f);
246 void metadata_do(void f(Metadata*));
245 }; 247 };
246 248
247 class ThreadStackTrace : public CHeapObj<mtInternal> { 249 class ThreadStackTrace : public CHeapObj<mtInternal> {
248 private: 250 private:
249 JavaThread* _thread; 251 JavaThread* _thread;
263 265
264 void add_stack_frame(javaVFrame* jvf); 266 void add_stack_frame(javaVFrame* jvf);
265 void dump_stack_at_safepoint(int max_depth); 267 void dump_stack_at_safepoint(int max_depth);
266 Handle allocate_fill_stack_trace_element_array(TRAPS); 268 Handle allocate_fill_stack_trace_element_array(TRAPS);
267 void oops_do(OopClosure* f); 269 void oops_do(OopClosure* f);
270 void metadata_do(void f(Metadata*));
268 GrowableArray<oop>* jni_locked_monitors() { return _jni_locked_monitors; } 271 GrowableArray<oop>* jni_locked_monitors() { return _jni_locked_monitors; }
269 int num_jni_locked_monitors() { return (_jni_locked_monitors != NULL ? _jni_locked_monitors->length() : 0); } 272 int num_jni_locked_monitors() { return (_jni_locked_monitors != NULL ? _jni_locked_monitors->length() : 0); }
270 273
271 bool is_owned_monitor_on_stack(oop object); 274 bool is_owned_monitor_on_stack(oop object);
272 void add_jni_locked_monitor(oop object) { _jni_locked_monitors->append(object); } 275 void add_jni_locked_monitor(oop object) { _jni_locked_monitors->append(object); }
278 class StackFrameInfo : public CHeapObj<mtInternal> { 281 class StackFrameInfo : public CHeapObj<mtInternal> {
279 private: 282 private:
280 Method* _method; 283 Method* _method;
281 int _bci; 284 int _bci;
282 GrowableArray<oop>* _locked_monitors; // list of object monitors locked by this frame 285 GrowableArray<oop>* _locked_monitors; // list of object monitors locked by this frame
286 // We need to save the mirrors in the backtrace to keep the class
287 // from being unloaded while we still have this stack trace.
288 oop _class_holder;
283 289
284 public: 290 public:
285 291
286 StackFrameInfo(javaVFrame* jvf, bool with_locked_monitors); 292 StackFrameInfo(javaVFrame* jvf, bool with_locked_monitors);
287 ~StackFrameInfo() { 293 ~StackFrameInfo() {
288 if (_locked_monitors != NULL) { 294 if (_locked_monitors != NULL) {
289 delete _locked_monitors; 295 delete _locked_monitors;
290 } 296 }
291 }; 297 };
292 Method* method() const { return _method; } 298 Method* method() const { return _method; }
293 int bci() const { return _bci; } 299 int bci() const { return _bci; }
294 void oops_do(OopClosure* f); 300 void oops_do(OopClosure* f);
301 void metadata_do(void f(Metadata*));
295 302
296 int num_locked_monitors() { return (_locked_monitors != NULL ? _locked_monitors->length() : 0); } 303 int num_locked_monitors() { return (_locked_monitors != NULL ? _locked_monitors->length() : 0); }
297 GrowableArray<oop>* locked_monitors() { return _locked_monitors; } 304 GrowableArray<oop>* locked_monitors() { return _locked_monitors; }
298 305
299 void print_on(outputStream* st) const; 306 void print_on(outputStream* st) const;
352 ThreadDumpResult* next() { return _next; } 359 ThreadDumpResult* next() { return _next; }
353 int num_threads() { return _num_threads; } 360 int num_threads() { return _num_threads; }
354 int num_snapshots() { return _num_snapshots; } 361 int num_snapshots() { return _num_snapshots; }
355 ThreadSnapshot* snapshots() { return _snapshots; } 362 ThreadSnapshot* snapshots() { return _snapshots; }
356 void oops_do(OopClosure* f); 363 void oops_do(OopClosure* f);
364 void metadata_do(void f(Metadata*));
357 }; 365 };
358 366
359 class DeadlockCycle : public CHeapObj<mtInternal> { 367 class DeadlockCycle : public CHeapObj<mtInternal> {
360 private: 368 private:
361 bool _is_deadlock; 369 bool _is_deadlock;