< prev index next >

src/hotspot/share/services/threadService.cpp

Print this page
rev 52112 : [mq]: 8021335

*** 55,66 **** PerfCounter* ThreadService::_total_threads_count = NULL; PerfVariable* ThreadService::_live_threads_count = NULL; PerfVariable* ThreadService::_peak_threads_count = NULL; PerfVariable* ThreadService::_daemon_threads_count = NULL; - volatile int ThreadService::_exiting_threads_count = 0; - volatile int ThreadService::_exiting_daemon_threads_count = 0; ThreadDumpResult* ThreadService::_threaddump_list = NULL; static const int INITIAL_ARRAY_SIZE = 10; --- 55,64 ----
*** 99,112 **** // to synchronize with thread addition and removal. MutexLockerEx mu(Threads_lock); _peak_threads_count->set_value(get_live_thread_count()); } void ThreadService::add_thread(JavaThread* thread, bool daemon) { ! // Do not count VM internal or JVMTI agent threads ! if (thread->is_hidden_from_external_view() || ! thread->is_jvmti_agent_thread()) { return; } _total_threads_count->inc(); _live_threads_count->inc(); --- 97,116 ---- // to synchronize with thread addition and removal. MutexLockerEx mu(Threads_lock); _peak_threads_count->set_value(get_live_thread_count()); } + static bool is_hidden_thread(JavaThread *thread) { + // hide VM internal or JVMTI agent threads + return thread->is_hidden_from_external_view() || thread->is_jvmti_agent_thread(); + } + void ThreadService::add_thread(JavaThread* thread, bool daemon) { ! assert(Threads_lock->owned_by_self(), "must have threads lock"); ! ! // Do not count hidden threads ! if (is_hidden_thread(thread)) { return; } _total_threads_count->inc(); _live_threads_count->inc();
*** 118,152 **** if (daemon) { _daemon_threads_count->inc(); } } ! void ThreadService::remove_thread(JavaThread* thread, bool daemon) { ! Atomic::dec(&_exiting_threads_count); if (daemon) { ! Atomic::dec(&_exiting_daemon_threads_count); } ! if (thread->is_hidden_from_external_view() || ! thread->is_jvmti_agent_thread()) { return; } ! _live_threads_count->set_value(_live_threads_count->get_value() - 1); ! if (daemon) { ! _daemon_threads_count->set_value(_daemon_threads_count->get_value() - 1); } } ! void ThreadService::current_thread_exiting(JavaThread* jt) { ! assert(jt == JavaThread::current(), "Called by current thread"); ! Atomic::inc(&_exiting_threads_count); ! oop threadObj = jt->threadObj(); ! if (threadObj != NULL && java_lang_Thread::is_daemon(threadObj)) { ! Atomic::inc(&_exiting_daemon_threads_count); } } // FIXME: JVMTI should call this function Handle ThreadService::get_current_contended_monitor(JavaThread* thread) { assert(thread != NULL, "should be non-NULL"); --- 122,169 ---- if (daemon) { _daemon_threads_count->inc(); } } ! void ThreadService::decrement_thread_counts(JavaThread* jt, bool daemon) { ! assert(Threads_lock->owned_by_self(), "must have threads lock"); ! ! _live_threads_count->dec(1); ! if (daemon) { ! _daemon_threads_count->dec(1); } + } + + void ThreadService::remove_thread(JavaThread* thread, bool daemon) { + assert(Threads_lock->owned_by_self(), "must have threads lock"); ! // Do not count hidden threads ! if (is_hidden_thread(thread)) { return; } ! assert(!thread->is_terminated(), "must not be terminated"); ! if (!thread->is_exiting()) { ! // JavaThread::exit() skipped calling current_thread_exiting() ! decrement_thread_counts(thread, daemon); } + } ! void ThreadService::current_thread_exiting(JavaThread* jt, bool daemon) { ! assert(Threads_lock->owned_by_self(), "must have threads lock"); ! // Do not count hidden threads ! if (is_hidden_thread(jt)) { ! return; } + + assert(jt == JavaThread::current(), "Called by current thread"); + assert(!jt->is_terminated() && jt->is_exiting(), "must be exiting"); + + decrement_thread_counts(jt, daemon); } // FIXME: JVMTI should call this function Handle ThreadService::get_current_contended_monitor(JavaThread* thread) { assert(thread != NULL, "should be non-NULL");
< prev index next >