38 return SafepointSynchronize::do_call_back();
39 }
40
41 bool SafepointMechanism::local_poll(Thread* thread) {
42 if (thread->is_Java_thread()) {
43 return local_poll_armed((JavaThread*)thread);
44 } else {
45 // If the poll is on a non-java thread we can only check the global state.
46 return global_poll();
47 }
48 }
49
50 bool SafepointMechanism::should_block(Thread* thread) {
51 if (uses_thread_local_poll()) {
52 return local_poll(thread);
53 } else {
54 return global_poll();
55 }
56 }
57
58 void SafepointMechanism::block_if_requested_local_poll(JavaThread *thread) {
59 bool armed = local_poll_armed(thread); // load acquire, polling page -> op / global state
60 if(armed) {
61 // We could be armed for either a handshake operation or a safepoint
62 if (global_poll()) {
63 SafepointSynchronize::block(thread);
64 }
65 if (thread->has_handshake()) {
66 thread->handshake_process_by_self();
67 }
68 }
69 }
70
71 void SafepointMechanism::block_if_requested(JavaThread *thread) {
72 if (uses_thread_local_poll()) {
73 block_if_requested_local_poll(thread);
74 } else {
75 // If we don't have per thread poll this could a handshake or a safepoint
76 if (global_poll()) {
77 SafepointSynchronize::block(thread);
78 }
79 }
80 }
81
82 void SafepointMechanism::arm_local_poll(JavaThread* thread) {
83 thread->set_polling_page(poll_armed_value());
84 }
85
86 void SafepointMechanism::disarm_local_poll(JavaThread* thread) {
87 thread->set_polling_page(poll_disarmed_value());
88 }
89
90 void SafepointMechanism::arm_local_poll_release(JavaThread* thread) {
91 thread->set_polling_page_release(poll_armed_value());
92 }
93
94 void SafepointMechanism::disarm_local_poll_release(JavaThread* thread) {
95 thread->set_polling_page_release(poll_disarmed_value());
96 }
97
98 #endif // SHARE_RUNTIME_SAFEPOINTMECHANISM_INLINE_HPP
|
38 return SafepointSynchronize::do_call_back();
39 }
40
41 bool SafepointMechanism::local_poll(Thread* thread) {
42 if (thread->is_Java_thread()) {
43 return local_poll_armed((JavaThread*)thread);
44 } else {
45 // If the poll is on a non-java thread we can only check the global state.
46 return global_poll();
47 }
48 }
49
50 bool SafepointMechanism::should_block(Thread* thread) {
51 if (uses_thread_local_poll()) {
52 return local_poll(thread);
53 } else {
54 return global_poll();
55 }
56 }
57
58 void SafepointMechanism::block_if_requested(JavaThread *thread) {
59 if (uses_thread_local_poll() && !SafepointMechanism::local_poll_armed(thread)) {
60 return;
61 }
62 block_if_requested_slow(thread);
63 }
64
65 void SafepointMechanism::arm_local_poll(JavaThread* thread) {
66 thread->set_polling_page(poll_armed_value());
67 }
68
69 void SafepointMechanism::disarm_local_poll(JavaThread* thread) {
70 thread->set_polling_page(poll_disarmed_value());
71 }
72
73 void SafepointMechanism::arm_local_poll_release(JavaThread* thread) {
74 thread->set_polling_page_release(poll_armed_value());
75 }
76
77 void SafepointMechanism::disarm_local_poll_release(JavaThread* thread) {
78 thread->set_polling_page_release(poll_disarmed_value());
79 }
80
81 #endif // SHARE_RUNTIME_SAFEPOINTMECHANISM_INLINE_HPP
|