50 #include "utilities/macros.hpp" |
50 #include "utilities/macros.hpp" |
51 #ifdef ZERO |
51 #ifdef ZERO |
52 # include "stack_zero.hpp" |
52 # include "stack_zero.hpp" |
53 #endif |
53 #endif |
54 |
54 |
|
55 class SafeThreadsListPtr; |
55 class ThreadSafepointState; |
56 class ThreadSafepointState; |
56 class ThreadsList; |
57 class ThreadsList; |
57 class ThreadsSMRSupport; |
58 class ThreadsSMRSupport; |
58 class NestedThreadsList; |
|
59 |
59 |
60 class JvmtiThreadState; |
60 class JvmtiThreadState; |
61 class JvmtiGetLoadedClassesClosure; |
61 class JvmtiGetLoadedClassesClosure; |
62 class ThreadStatistics; |
62 class ThreadStatistics; |
63 class ConcurrentLocksDump; |
63 class ConcurrentLocksDump; |
133 protected: |
133 protected: |
134 // Support for forcing alignment of thread objects for biased locking |
134 // Support for forcing alignment of thread objects for biased locking |
135 void* _real_malloc_address; |
135 void* _real_malloc_address; |
136 |
136 |
137 // JavaThread lifecycle support: |
137 // JavaThread lifecycle support: |
|
138 friend class SafeThreadsListPtr; // for _threads_list_ptr, cmpxchg_threads_hazard_ptr(), {dec_,inc_,}nested_threads_hazard_ptr_cnt(), {g,s}et_threads_hazard_ptr(), inc_nested_handle_cnt(), tag_hazard_ptr() access |
138 friend class ScanHazardPtrGatherProtectedThreadsClosure; // for cmpxchg_threads_hazard_ptr(), get_threads_hazard_ptr(), is_hazard_ptr_tagged() access |
139 friend class ScanHazardPtrGatherProtectedThreadsClosure; // for cmpxchg_threads_hazard_ptr(), get_threads_hazard_ptr(), is_hazard_ptr_tagged() access |
139 friend class ScanHazardPtrGatherThreadsListClosure; // for get_nested_threads_hazard_ptr(), get_threads_hazard_ptr(), untag_hazard_ptr() access |
140 friend class ScanHazardPtrGatherThreadsListClosure; // for get_threads_hazard_ptr(), untag_hazard_ptr() access |
140 friend class ScanHazardPtrPrintMatchingThreadsClosure; // for get_threads_hazard_ptr(), is_hazard_ptr_tagged() access |
141 friend class ScanHazardPtrPrintMatchingThreadsClosure; // for get_threads_hazard_ptr(), is_hazard_ptr_tagged() access |
141 friend class ThreadsListSetter; // for get_threads_hazard_ptr() access |
142 friend class ThreadsSMRSupport; // for _nested_threads_hazard_ptr_cnt, _threads_hazard_ptr, _threads_list_ptr access |
142 friend class ThreadsSMRSupport; // for get_threads_hazard_ptr() access |
|
143 |
143 |
144 ThreadsList* volatile _threads_hazard_ptr; |
144 ThreadsList* volatile _threads_hazard_ptr; |
|
145 SafeThreadsListPtr* _threads_list_ptr; |
145 ThreadsList* cmpxchg_threads_hazard_ptr(ThreadsList* exchange_value, ThreadsList* compare_value); |
146 ThreadsList* cmpxchg_threads_hazard_ptr(ThreadsList* exchange_value, ThreadsList* compare_value); |
146 ThreadsList* get_threads_hazard_ptr(); |
147 ThreadsList* get_threads_hazard_ptr(); |
147 void set_threads_hazard_ptr(ThreadsList* new_list); |
148 void set_threads_hazard_ptr(ThreadsList* new_list); |
148 static bool is_hazard_ptr_tagged(ThreadsList* list) { |
149 static bool is_hazard_ptr_tagged(ThreadsList* list) { |
149 return (intptr_t(list) & intptr_t(1)) == intptr_t(1); |
150 return (intptr_t(list) & intptr_t(1)) == intptr_t(1); |
151 static ThreadsList* tag_hazard_ptr(ThreadsList* list) { |
152 static ThreadsList* tag_hazard_ptr(ThreadsList* list) { |
152 return (ThreadsList*)(intptr_t(list) | intptr_t(1)); |
153 return (ThreadsList*)(intptr_t(list) | intptr_t(1)); |
153 } |
154 } |
154 static ThreadsList* untag_hazard_ptr(ThreadsList* list) { |
155 static ThreadsList* untag_hazard_ptr(ThreadsList* list) { |
155 return (ThreadsList*)(intptr_t(list) & ~intptr_t(1)); |
156 return (ThreadsList*)(intptr_t(list) & ~intptr_t(1)); |
156 } |
|
157 NestedThreadsList* _nested_threads_hazard_ptr; |
|
158 NestedThreadsList* get_nested_threads_hazard_ptr() { |
|
159 return _nested_threads_hazard_ptr; |
|
160 } |
|
161 void set_nested_threads_hazard_ptr(NestedThreadsList* value) { |
|
162 assert(Threads_lock->owned_by_self(), |
|
163 "must own Threads_lock for _nested_threads_hazard_ptr to be valid."); |
|
164 _nested_threads_hazard_ptr = value; |
|
165 } |
157 } |
166 // This field is enabled via -XX:+EnableThreadSMRStatistics: |
158 // This field is enabled via -XX:+EnableThreadSMRStatistics: |
167 uint _nested_threads_hazard_ptr_cnt; |
159 uint _nested_threads_hazard_ptr_cnt; |
168 void dec_nested_threads_hazard_ptr_cnt() { |
160 void dec_nested_threads_hazard_ptr_cnt() { |
169 assert(_nested_threads_hazard_ptr_cnt != 0, "mismatched {dec,inc}_nested_threads_hazard_ptr_cnt()"); |
161 assert(_nested_threads_hazard_ptr_cnt != 0, "mismatched {dec,inc}_nested_threads_hazard_ptr_cnt()"); |
638 int lgrp_id() const { return _lgrp_id; } |
630 int lgrp_id() const { return _lgrp_id; } |
639 void set_lgrp_id(int value) { _lgrp_id = value; } |
631 void set_lgrp_id(int value) { _lgrp_id = value; } |
640 |
632 |
641 // Printing |
633 // Printing |
642 virtual void print_on(outputStream* st) const; |
634 virtual void print_on(outputStream* st) const; |
643 virtual void print_nested_threads_hazard_ptrs_on(outputStream* st) const; |
|
644 void print() const { print_on(tty); } |
635 void print() const { print_on(tty); } |
645 virtual void print_on_error(outputStream* st, char* buf, int buflen) const; |
636 virtual void print_on_error(outputStream* st, char* buf, int buflen) const; |
646 void print_value_on(outputStream* st) const; |
637 void print_value_on(outputStream* st) const; |
647 |
638 |
648 // Debug-only code |
639 // Debug-only code |