1628 _names_strings = names; 1629 _names_len = names->length(); 1630 _names_chars = NEW_C_HEAP_ARRAY(char*, _names_len, mtInternal); 1631 _times = times; 1632 _times_len = times->length(); 1633 _count = 0; 1634 } 1635 1636 // 1637 // Called with Threads_lock held 1638 // 1639 void ThreadTimesClosure::do_thread(Thread* thread) { 1640 assert(Threads_lock->owned_by_self(), "Must hold Threads_lock"); 1641 assert(thread != NULL, "thread was NULL"); 1642 1643 // exclude externally visible JavaThreads 1644 if (thread->is_Java_thread() && !thread->is_hidden_from_external_view()) { 1645 return; 1646 } 1647 1648 // NonJavaThread instances may not be fully initialized yet, so we need to 1649 // skip any that aren't - check for zero stack_size() 1650 if (!thread->is_Java_thread() && thread->stack_size() == 0) { 1651 return; 1652 } 1653 1654 if (_count >= _names_len || _count >= _times_len) { 1655 // skip if the result array is not big enough 1656 return; 1657 } 1658 1659 EXCEPTION_MARK; 1660 ResourceMark rm(THREAD); // thread->name() uses ResourceArea 1661 1662 assert(thread->name() != NULL, "All threads should have a name"); 1663 _names_chars[_count] = os::strdup(thread->name()); 1664 _times->long_at_put(_count, os::is_thread_cpu_time_supported() ? 1665 os::thread_cpu_time(thread) : -1); 1666 _count++; 1667 } 1668 1669 // Called without Threads_lock, we can allocate String objects. 1670 void ThreadTimesClosure::do_unlocked() { 1671 1672 EXCEPTION_MARK; 1673 for (int i = 0; i < _count; i++) { | 1628 _names_strings = names; 1629 _names_len = names->length(); 1630 _names_chars = NEW_C_HEAP_ARRAY(char*, _names_len, mtInternal); 1631 _times = times; 1632 _times_len = times->length(); 1633 _count = 0; 1634 } 1635 1636 // 1637 // Called with Threads_lock held 1638 // 1639 void ThreadTimesClosure::do_thread(Thread* thread) { 1640 assert(Threads_lock->owned_by_self(), "Must hold Threads_lock"); 1641 assert(thread != NULL, "thread was NULL"); 1642 1643 // exclude externally visible JavaThreads 1644 if (thread->is_Java_thread() && !thread->is_hidden_from_external_view()) { 1645 return; 1646 } 1647 1648 if (_count >= _names_len || _count >= _times_len) { 1649 // skip if the result array is not big enough 1650 return; 1651 } 1652 1653 EXCEPTION_MARK; 1654 ResourceMark rm(THREAD); // thread->name() uses ResourceArea 1655 1656 assert(thread->name() != NULL, "All threads should have a name"); 1657 _names_chars[_count] = os::strdup(thread->name()); 1658 _times->long_at_put(_count, os::is_thread_cpu_time_supported() ? 1659 os::thread_cpu_time(thread) : -1); 1660 _count++; 1661 } 1662 1663 // Called without Threads_lock, we can allocate String objects. 1664 void ThreadTimesClosure::do_unlocked() { 1665 1666 EXCEPTION_MARK; 1667 for (int i = 0; i < _count; i++) { |