< prev index next >

src/hotspot/share/runtime/threadSMR.cpp

Print this page

        

*** 24,37 **** --- 24,39 ---- #include "precompiled.hpp" #include "logging/logStream.hpp" #include "memory/allocation.inline.hpp" #include "runtime/jniHandles.inline.hpp" + #include "runtime/sharedRuntime.hpp" #include "runtime/thread.inline.hpp" #include "runtime/threadSMR.inline.hpp" #include "runtime/vmOperations.hpp" #include "services/threadService.hpp" + #include "services/threadTable.hpp" #include "utilities/copy.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/ostream.hpp" #include "utilities/resourceHash.hpp" #include "utilities/vmError.hpp"
*** 605,628 **** } } return -1; } JavaThread* ThreadsList::find_JavaThread_from_java_tid(jlong java_tid) const { for (uint i = 0; i < length(); i++) { JavaThread* thread = thread_at(i); ! oop tobj = thread->threadObj(); ! // Ignore the thread if it hasn't run yet, has exited ! // or is starting to exit. ! if (tobj != NULL && !thread->is_exiting() && ! java_tid == java_lang_Thread::thread_id(tobj)) { ! // found a match return thread; } } return NULL; } void ThreadsList::inc_nested_handle_cnt() { // The increment needs to be MO_SEQ_CST so that the reference counter // update is seen before the subsequent hazard ptr update. Atomic::inc(&_nested_handle_cnt); --- 607,643 ---- } } return -1; } + #define PMIMORDIAL_JAVA_TID 1 + JavaThread* ThreadsList::find_JavaThread_from_java_tid(jlong java_tid) const { + JavaThread* java_thread = ThreadTable::find_thread(java_tid); + if (java_thread == NULL && java_tid == PMIMORDIAL_JAVA_TID) { + // ThreadsSMRSupport::add_thread() is not called for the primordial + // thread. Thus, we find this thread with a linear search and add it + // to the thread table. for (uint i = 0; i < length(); i++) { JavaThread* thread = thread_at(i); ! if (is_valid_java_thread(java_tid,thread)) { ! ThreadTable::add_thread(java_tid, thread); return thread; } } + } else if (java_thread != NULL && is_valid_java_thread(java_tid, java_thread)) { + return java_thread; + } return NULL; } + bool ThreadsList::is_valid_java_thread(jlong java_tid, JavaThread* java_thread) { + oop tobj = java_thread->threadObj(); + // Ignore the thread if it hasn't run yet, has exited + // or is starting to exit. + return (tobj != NULL && !java_thread->is_exiting() && + java_tid == java_lang_Thread::thread_id(tobj)); + } void ThreadsList::inc_nested_handle_cnt() { // The increment needs to be MO_SEQ_CST so that the reference counter // update is seen before the subsequent hazard ptr update. Atomic::inc(&_nested_handle_cnt);
*** 740,749 **** --- 755,766 ---- // Initial _java_thread_list will not generate a "Threads::add" mesg. log_debug(thread, smr)("tid=" UINTX_FORMAT ": Threads::add: new ThreadsList=" INTPTR_FORMAT, os::current_thread_id(), p2i(new_list)); ThreadsList *old_list = xchg_java_thread_list(new_list); free_list(old_list); + jlong tid = SharedRuntime::get_java_tid(thread); + ThreadTable::add_thread(tid, thread); } // set_delete_notify() and clear_delete_notify() are called // under the protection of the delete_lock, but we also use an // Atomic operation to ensure the memory update is seen earlier than
*** 907,916 **** --- 924,935 ---- log_debug(thread, smr)("tid=" UINTX_FORMAT ": ThreadsSMRSupport::release_stable_list notified %s", os::current_thread_id(), log_str); } } void ThreadsSMRSupport::remove_thread(JavaThread *thread) { + jlong tid = SharedRuntime::get_java_tid(thread); + ThreadTable::remove_thread(tid); ThreadsList *new_list = ThreadsList::remove_thread(ThreadsSMRSupport::get_java_thread_list(), thread); if (EnableThreadSMRStatistics) { ThreadsSMRSupport::inc_java_thread_list_alloc_cnt(); // This list is smaller so no need to check for a "longest" update. }
< prev index next >