35 inline void ThreadsList::threads_do_dispatch(T *cl, JavaThread *const thread) const {
36 cl->T::do_thread(thread);
37 }
38
39 template <>
40 inline void ThreadsList::threads_do_dispatch<ThreadClosure>(ThreadClosure *cl, JavaThread *const thread) const {
41 cl->do_thread(thread);
42 }
43
44 template <class T>
45 inline void ThreadsList::threads_do(T *cl) const {
46 const intx scan_interval = PrefetchScanIntervalInBytes;
47 JavaThread *const *const end = _threads + _length;
48 for (JavaThread *const *current_p = _threads; current_p != end; current_p++) {
49 Prefetch::read((void*)current_p, scan_interval);
50 JavaThread *const current = *current_p;
51 threads_do_dispatch(cl, current);
52 }
53 }
54
55 inline ThreadsList* ThreadsListSetter::list() {
56 ThreadsList *ret = _target->get_threads_hazard_ptr();
57 assert(ret != NULL, "hazard ptr should be set");
58 assert(!Thread::is_hazard_ptr_tagged(ret), "hazard ptr should be validated");
59 return ret;
60 }
61
62 #endif // SHARE_VM_RUNTIME_THREADSMR_INLINE_HPP
|
35 inline void ThreadsList::threads_do_dispatch(T *cl, JavaThread *const thread) const {
36 cl->T::do_thread(thread);
37 }
38
39 template <>
40 inline void ThreadsList::threads_do_dispatch<ThreadClosure>(ThreadClosure *cl, JavaThread *const thread) const {
41 cl->do_thread(thread);
42 }
43
44 template <class T>
45 inline void ThreadsList::threads_do(T *cl) const {
46 const intx scan_interval = PrefetchScanIntervalInBytes;
47 JavaThread *const *const end = _threads + _length;
48 for (JavaThread *const *current_p = _threads; current_p != end; current_p++) {
49 Prefetch::read((void*)current_p, scan_interval);
50 JavaThread *const current = *current_p;
51 threads_do_dispatch(cl, current);
52 }
53 }
54
55 // These three inlines are private to ThreadsSMRSupport, but
56 // they are called by public inline update_smr_tlh_stats() below:
57
58 inline void ThreadsSMRSupport::add_smr_tlh_times(uint add_value) {
59 Atomic::add(add_value, &_smr_tlh_times);
60 }
61
62 inline void ThreadsSMRSupport::inc_smr_tlh_cnt() {
63 Atomic::inc(&_smr_tlh_cnt);
64 }
65
66 inline void ThreadsSMRSupport::update_smr_tlh_time_max(uint new_value) {
67 while (true) {
68 uint cur_value = _smr_tlh_time_max;
69 if (new_value <= cur_value) {
70 // No need to update max value so we're done.
71 break;
72 }
73 if (Atomic::cmpxchg(new_value, &_smr_tlh_time_max, cur_value) == cur_value) {
74 // Updated max value so we're done. Otherwise try it all again.
75 break;
76 }
77 }
78 }
79
80
81 inline ThreadsList* ThreadsListSetter::list() {
82 ThreadsList *ret = _target->get_threads_hazard_ptr();
83 assert(ret != NULL, "hazard ptr should be set");
84 assert(!Thread::is_hazard_ptr_tagged(ret), "hazard ptr should be validated");
85 return ret;
86 }
87
88 inline ThreadsList* ThreadsSMRSupport::get_smr_java_thread_list() {
89 return (ThreadsList*)OrderAccess::load_acquire(&_smr_java_thread_list);
90 }
91
92 inline bool ThreadsSMRSupport::is_a_protected_JavaThread_with_lock(JavaThread *thread) {
93 MutexLockerEx ml(Threads_lock->owned_by_self() ? NULL : Threads_lock);
94 return is_a_protected_JavaThread(thread);
95 }
96
97 inline void ThreadsSMRSupport::update_smr_tlh_stats(uint millis) {
98 ThreadsSMRSupport::inc_smr_tlh_cnt();
99 ThreadsSMRSupport::add_smr_tlh_times(millis);
100 ThreadsSMRSupport::update_smr_tlh_time_max(millis);
101 }
102
103 #endif // SHARE_VM_RUNTIME_THREADSMR_INLINE_HPP
|