195
196 inline bool JavaThread::is_terminated() const {
197 // Use load-acquire so that setting of _terminated by
198 // JavaThread::exit() is seen more quickly.
199 TerminatedTypes l_terminated = (TerminatedTypes)
200 OrderAccess::load_acquire((volatile jint *) &_terminated);
201 return check_is_terminated(l_terminated);
202 }
203
204 inline void JavaThread::set_terminated(TerminatedTypes t) {
205 // use release-store so the setting of _terminated is seen more quickly
206 OrderAccess::release_store((volatile jint *) &_terminated, (jint) t);
207 }
208
209 // special for Threads::remove() which is static:
210 inline void JavaThread::set_terminated_value() {
211 // use release-store so the setting of _terminated is seen more quickly
212 OrderAccess::release_store((volatile jint *) &_terminated, (jint) _thread_terminated);
213 }
214
215 template <class T>
216 inline void Threads::threads_do_smr(T *tc, Thread *self) {
217 ThreadsListHandle handle(self);
218 handle.threads_do(tc);
219 }
220
221 inline ThreadsList* Threads::get_smr_java_thread_list() {
222 return (ThreadsList*)OrderAccess::load_acquire(&_smr_java_thread_list);
223 }
224
225 inline ThreadsList* Threads::xchg_smr_java_thread_list(ThreadsList* new_list) {
226 return (ThreadsList*)Atomic::xchg(new_list, &_smr_java_thread_list);
227 }
228
229 inline void Threads::inc_smr_deleted_thread_cnt() {
230 Atomic::inc(&_smr_deleted_thread_cnt);
231 }
232
233 inline void Threads::update_smr_deleted_thread_time_max(uint new_value) {
234 while (true) {
235 uint cur_value = _smr_deleted_thread_time_max;
236 if (new_value <= cur_value) {
237 // No need to update max value so we're done.
238 break;
239 }
240 if (Atomic::cmpxchg(new_value, &_smr_deleted_thread_time_max, cur_value) == cur_value) {
|
195
196 inline bool JavaThread::is_terminated() const {
197 // Use load-acquire so that setting of _terminated by
198 // JavaThread::exit() is seen more quickly.
199 TerminatedTypes l_terminated = (TerminatedTypes)
200 OrderAccess::load_acquire((volatile jint *) &_terminated);
201 return check_is_terminated(l_terminated);
202 }
203
204 inline void JavaThread::set_terminated(TerminatedTypes t) {
205 // use release-store so the setting of _terminated is seen more quickly
206 OrderAccess::release_store((volatile jint *) &_terminated, (jint) t);
207 }
208
209 // special for Threads::remove() which is static:
210 inline void JavaThread::set_terminated_value() {
211 // use release-store so the setting of _terminated is seen more quickly
212 OrderAccess::release_store((volatile jint *) &_terminated, (jint) _thread_terminated);
213 }
214
215 inline ThreadsList* Threads::get_smr_java_thread_list() {
216 return (ThreadsList*)OrderAccess::load_acquire(&_smr_java_thread_list);
217 }
218
219 inline ThreadsList* Threads::xchg_smr_java_thread_list(ThreadsList* new_list) {
220 return (ThreadsList*)Atomic::xchg(new_list, &_smr_java_thread_list);
221 }
222
223 inline void Threads::inc_smr_deleted_thread_cnt() {
224 Atomic::inc(&_smr_deleted_thread_cnt);
225 }
226
227 inline void Threads::update_smr_deleted_thread_time_max(uint new_value) {
228 while (true) {
229 uint cur_value = _smr_deleted_thread_time_max;
230 if (new_value <= cur_value) {
231 // No need to update max value so we're done.
232 break;
233 }
234 if (Atomic::cmpxchg(new_value, &_smr_deleted_thread_time_max, cur_value) == cur_value) {
|