src/hotspot/share/runtime/thread.cpp
changeset 48173 cb63f08dad03
parent 48105 8d15b1369c7a
child 48312 2a1413298af0
equal deleted inserted replaced
48172:e26fc5201707 48173:cb63f08dad03
  3559              *X = (JavaThread*)prefetch_and_load_ptr((void**)MACRO_current_p, (intx)MACRO_scan_interval);                 \
  3559              *X = (JavaThread*)prefetch_and_load_ptr((void**)MACRO_current_p, (intx)MACRO_scan_interval);                 \
  3560          MACRO_current_p != MACRO_end;                                                                                    \
  3560          MACRO_current_p != MACRO_end;                                                                                    \
  3561          MACRO_current_p++,                                                                                               \
  3561          MACRO_current_p++,                                                                                               \
  3562              X = (JavaThread*)prefetch_and_load_ptr((void**)MACRO_current_p, (intx)MACRO_scan_interval))
  3562              X = (JavaThread*)prefetch_and_load_ptr((void**)MACRO_current_p, (intx)MACRO_scan_interval))
  3563 
  3563 
       
  3564 inline ThreadsList* Threads::get_smr_java_thread_list() {
       
  3565   return (ThreadsList*)OrderAccess::load_acquire(&_smr_java_thread_list);
       
  3566 }
       
  3567 
  3564 // All JavaThreads
  3568 // All JavaThreads
  3565 #define ALL_JAVA_THREADS(X) DO_JAVA_THREADS(get_smr_java_thread_list(), X)
  3569 #define ALL_JAVA_THREADS(X) DO_JAVA_THREADS(get_smr_java_thread_list(), X)
  3566 
  3570 
  3567 // All JavaThreads + all non-JavaThreads (i.e., every thread in the system)
  3571 // All JavaThreads + all non-JavaThreads (i.e., every thread in the system)
  3568 void Threads::threads_do(ThreadClosure* tc) {
  3572 void Threads::threads_do(ThreadClosure* tc) {
  3770   log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::acquire_stable_list: add NestedThreadsList node containing ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(node->t_list()));
  3774   log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::acquire_stable_list: add NestedThreadsList node containing ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(node->t_list()));
  3771 
  3775 
  3772   return node->t_list();
  3776   return node->t_list();
  3773 }
  3777 }
  3774 
  3778 
       
  3779 inline void Threads::add_smr_deleted_thread_times(uint add_value) {
       
  3780   Atomic::add(add_value, &_smr_deleted_thread_times);
       
  3781 }
       
  3782 
       
  3783 inline void Threads::inc_smr_deleted_thread_cnt() {
       
  3784   Atomic::inc(&_smr_deleted_thread_cnt);
       
  3785 }
       
  3786 
  3775 // Release a stable ThreadsList.
  3787 // Release a stable ThreadsList.
  3776 //
  3788 //
  3777 void Threads::release_stable_list(Thread *self) {
  3789 void Threads::release_stable_list(Thread *self) {
  3778   assert(self != NULL, "sanity check");
  3790   assert(self != NULL, "sanity check");
  3779   // release_stable_list_nested_path() will grab the Threads_lock
  3791   // release_stable_list_nested_path() will grab the Threads_lock
  3867     // Notify any exiting JavaThreads that are waiting in smr_delete()
  3879     // Notify any exiting JavaThreads that are waiting in smr_delete()
  3868     // that we've released a ThreadsList.
  3880     // that we've released a ThreadsList.
  3869     ml.notify_all();
  3881     ml.notify_all();
  3870     log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::release_stable_list notified %s", os::current_thread_id(), log_str);
  3882     log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::release_stable_list notified %s", os::current_thread_id(), log_str);
  3871   }
  3883   }
       
  3884 }
       
  3885 
       
  3886 inline void Threads::update_smr_deleted_thread_time_max(uint new_value) {
       
  3887   while (true) {
       
  3888     uint cur_value = _smr_deleted_thread_time_max;
       
  3889     if (new_value <= cur_value) {
       
  3890       // No need to update max value so we're done.
       
  3891       break;
       
  3892     }
       
  3893     if (Atomic::cmpxchg(new_value, &_smr_deleted_thread_time_max, cur_value) == cur_value) {
       
  3894       // Updated max value so we're done. Otherwise try it all again.
       
  3895       break;
       
  3896     }
       
  3897   }
       
  3898 }
       
  3899 
       
  3900 inline ThreadsList* Threads::xchg_smr_java_thread_list(ThreadsList* new_list) {
       
  3901   return (ThreadsList*)Atomic::xchg(new_list, &_smr_java_thread_list);
  3872 }
  3902 }
  3873 
  3903 
  3874 void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) {
  3904 void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) {
  3875   TraceTime timer("Initialize java.lang classes", TRACETIME_LOG(Info, startuptime));
  3905   TraceTime timer("Initialize java.lang classes", TRACETIME_LOG(Info, startuptime));
  3876 
  3906