360 int _num_snapshots;
361 ThreadSnapshot* _snapshots;
362 ThreadSnapshot* _last;
363 ThreadDumpResult* _next;
364 ThreadsListSetter _setter; // Helper to set hazard ptr in the originating thread
365 // which protects the JavaThreads in _snapshots.
366
367 public:
368 ThreadDumpResult();
369 ThreadDumpResult(int num_threads);
370 ~ThreadDumpResult();
371
372 void add_thread_snapshot(ThreadSnapshot* ts);
373 void set_next(ThreadDumpResult* next) { _next = next; }
374 ThreadDumpResult* next() { return _next; }
375 int num_threads() { return _num_threads; }
376 int num_snapshots() { return _num_snapshots; }
377 ThreadSnapshot* snapshots() { return _snapshots; }
378 void set_t_list() { _setter.set(); }
379 ThreadsList* t_list();
380 bool t_list_has_been_set() { return _setter.target_needs_release(); }
381 void oops_do(OopClosure* f);
382 void metadata_do(void f(Metadata*));
383 };
384
385 class DeadlockCycle : public CHeapObj<mtInternal> {
386 private:
387 bool _is_deadlock;
388 GrowableArray<JavaThread*>* _threads;
389 DeadlockCycle* _next;
390 public:
391 DeadlockCycle();
392 ~DeadlockCycle();
393
394 DeadlockCycle* next() { return _next; }
395 void set_next(DeadlockCycle* d) { _next = d; }
396 void add_thread(JavaThread* t) { _threads->append(t); }
397 void reset() { _is_deadlock = false; _threads->clear(); }
398 void set_deadlock(bool value) { _is_deadlock = value; }
399 bool is_deadlock() { return _is_deadlock; }
400 int num_threads() { return _threads->length(); }
|
360 int _num_snapshots;
361 ThreadSnapshot* _snapshots;
362 ThreadSnapshot* _last;
363 ThreadDumpResult* _next;
364 ThreadsListSetter _setter; // Helper to set hazard ptr in the originating thread
365 // which protects the JavaThreads in _snapshots.
366
367 public:
368 ThreadDumpResult();
369 ThreadDumpResult(int num_threads);
370 ~ThreadDumpResult();
371
372 void add_thread_snapshot(ThreadSnapshot* ts);
373 void set_next(ThreadDumpResult* next) { _next = next; }
374 ThreadDumpResult* next() { return _next; }
375 int num_threads() { return _num_threads; }
376 int num_snapshots() { return _num_snapshots; }
377 ThreadSnapshot* snapshots() { return _snapshots; }
378 void set_t_list() { _setter.set(); }
379 ThreadsList* t_list();
380 bool t_list_has_been_set() { return _setter.is_set(); }
381 void oops_do(OopClosure* f);
382 void metadata_do(void f(Metadata*));
383 };
384
385 class DeadlockCycle : public CHeapObj<mtInternal> {
386 private:
387 bool _is_deadlock;
388 GrowableArray<JavaThread*>* _threads;
389 DeadlockCycle* _next;
390 public:
391 DeadlockCycle();
392 ~DeadlockCycle();
393
394 DeadlockCycle* next() { return _next; }
395 void set_next(DeadlockCycle* d) { _next = d; }
396 void add_thread(JavaThread* t) { _threads->append(t); }
397 void reset() { _is_deadlock = false; _threads->clear(); }
398 void set_deadlock(bool value) { _is_deadlock = value; }
399 bool is_deadlock() { return _is_deadlock; }
400 int num_threads() { return _threads->length(); }
|