mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8223306: Remove threads linked list (use ThreadsList's array in SA)
Reviewed-by: coleenp, dholmes, dcubed
This commit is contained in:
parent
a165ef39c6
commit
1645161cad
21 changed files with 133 additions and 117 deletions
|
@ -1613,7 +1613,6 @@ void JavaThread::initialize() {
|
|||
set_deopt_compiled_method(NULL);
|
||||
clear_must_deopt_id();
|
||||
set_monitor_chunks(NULL);
|
||||
set_next(NULL);
|
||||
_on_thread_list = false;
|
||||
set_thread_state(_thread_new);
|
||||
_terminated = _not_terminated;
|
||||
|
@ -3457,7 +3456,6 @@ void CodeCacheSweeperThread::nmethods_do(CodeBlobClosure* cf) {
|
|||
// would like. We are actively migrating Threads_lock uses to other
|
||||
// mechanisms in order to reduce Threads_lock contention.
|
||||
|
||||
JavaThread* Threads::_thread_list = NULL;
|
||||
int Threads::_number_of_threads = 0;
|
||||
int Threads::_number_of_non_daemon_threads = 0;
|
||||
int Threads::_return_code = 0;
|
||||
|
@ -3764,7 +3762,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
|||
}
|
||||
|
||||
// Initialize Threads state
|
||||
_thread_list = NULL;
|
||||
_number_of_threads = 0;
|
||||
_number_of_non_daemon_threads = 0;
|
||||
|
||||
|
@ -4423,9 +4420,6 @@ void Threads::add(JavaThread* p, bool force_daemon) {
|
|||
|
||||
BarrierSet::barrier_set()->on_thread_attach(p);
|
||||
|
||||
p->set_next(_thread_list);
|
||||
_thread_list = p;
|
||||
|
||||
// Once a JavaThread is added to the Threads list, smr_delete() has
|
||||
// to be used to delete it. Otherwise we can just delete it directly.
|
||||
p->set_on_thread_list();
|
||||
|
@ -4463,20 +4457,6 @@ void Threads::remove(JavaThread* p, bool is_daemon) {
|
|||
// Maintain fast thread list
|
||||
ThreadsSMRSupport::remove_thread(p);
|
||||
|
||||
JavaThread* current = _thread_list;
|
||||
JavaThread* prev = NULL;
|
||||
|
||||
while (current != p) {
|
||||
prev = current;
|
||||
current = current->next();
|
||||
}
|
||||
|
||||
if (prev) {
|
||||
prev->set_next(current->next());
|
||||
} else {
|
||||
_thread_list = p->next();
|
||||
}
|
||||
|
||||
_number_of_threads--;
|
||||
if (!is_daemon) {
|
||||
_number_of_non_daemon_threads--;
|
||||
|
|
|
@ -983,7 +983,6 @@ class JavaThread: public Thread {
|
|||
friend class JVMCIVMStructs;
|
||||
friend class WhiteBox;
|
||||
private:
|
||||
JavaThread* _next; // The next thread in the Threads list
|
||||
bool _on_thread_list; // Is set when this JavaThread is added to the Threads list
|
||||
oop _threadObj; // The Java level thread object
|
||||
|
||||
|
@ -1247,10 +1246,6 @@ class JavaThread: public Thread {
|
|||
virtual bool is_Java_thread() const { return true; }
|
||||
virtual bool can_call_java() const { return true; }
|
||||
|
||||
// Thread chain operations
|
||||
JavaThread* next() const { return _next; }
|
||||
void set_next(JavaThread* p) { _next = p; }
|
||||
|
||||
// Thread oop. threadObj() can be NULL for initial JavaThread
|
||||
// (or for threads attached via JNI)
|
||||
oop threadObj() const { return _threadObj; }
|
||||
|
@ -2213,7 +2208,6 @@ inline CompilerThread* CompilerThread::current() {
|
|||
class Threads: AllStatic {
|
||||
friend class VMStructs;
|
||||
private:
|
||||
static JavaThread* _thread_list;
|
||||
static int _number_of_threads;
|
||||
static int _number_of_non_daemon_threads;
|
||||
static int _return_code;
|
||||
|
|
|
@ -86,6 +86,7 @@ class ThreadClosure;
|
|||
// SMR Support for the Threads class.
|
||||
//
|
||||
class ThreadsSMRSupport : AllStatic {
|
||||
friend class VMStructs;
|
||||
friend class SafeThreadsListPtr; // for _nested_thread_list_max, delete_notify(), release_stable_list_wake_up() access
|
||||
|
||||
// The coordination between ThreadsSMRSupport::release_stable_list() and
|
||||
|
@ -158,6 +159,7 @@ class ThreadsSMRSupport : AllStatic {
|
|||
// A fast list of JavaThreads.
|
||||
//
|
||||
class ThreadsList : public CHeapObj<mtThread> {
|
||||
friend class VMStructs;
|
||||
friend class SafeThreadsListPtr; // for {dec,inc}_nested_handle_cnt() access
|
||||
friend class ThreadsSMRSupport; // for _nested_handle_cnt, {add,remove}_thread(), {,set_}next_list() access
|
||||
|
||||
|
|
|
@ -94,6 +94,7 @@
|
|||
#include "runtime/sharedRuntime.hpp"
|
||||
#include "runtime/stubRoutines.hpp"
|
||||
#include "runtime/thread.inline.hpp"
|
||||
#include "runtime/threadSMR.hpp"
|
||||
#include "runtime/vframeArray.hpp"
|
||||
#include "runtime/vmStructs.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
|
@ -740,10 +741,13 @@ typedef PaddedEnd<ObjectMonitor> PaddedObjectMonitor;
|
|||
/* Threads (NOTE: incomplete) */ \
|
||||
/******************************/ \
|
||||
\
|
||||
static_field(Threads, _thread_list, JavaThread*) \
|
||||
static_field(Threads, _number_of_threads, int) \
|
||||
static_field(Threads, _number_of_non_daemon_threads, int) \
|
||||
static_field(Threads, _return_code, int) \
|
||||
static_field(Threads, _number_of_threads, int) \
|
||||
static_field(Threads, _number_of_non_daemon_threads, int) \
|
||||
static_field(Threads, _return_code, int) \
|
||||
\
|
||||
static_ptr_volatile_field(ThreadsSMRSupport, _java_thread_list, ThreadsList*) \
|
||||
nonstatic_field(ThreadsList, _length, const uint) \
|
||||
nonstatic_field(ThreadsList, _threads, JavaThread *const *const) \
|
||||
\
|
||||
nonstatic_field(ThreadShadow, _pending_exception, oop) \
|
||||
nonstatic_field(ThreadShadow, _exception_file, const char*) \
|
||||
|
@ -757,7 +761,6 @@ typedef PaddedEnd<ObjectMonitor> PaddedObjectMonitor;
|
|||
nonstatic_field(Thread, _current_waiting_monitor, ObjectMonitor*) \
|
||||
nonstatic_field(NamedThread, _name, char*) \
|
||||
nonstatic_field(NamedThread, _processed_thread, JavaThread*) \
|
||||
nonstatic_field(JavaThread, _next, JavaThread*) \
|
||||
nonstatic_field(JavaThread, _threadObj, oop) \
|
||||
nonstatic_field(JavaThread, _anchor, JavaFrameAnchor) \
|
||||
nonstatic_field(JavaThread, _vm_result, oop) \
|
||||
|
@ -1371,6 +1374,9 @@ typedef PaddedEnd<ObjectMonitor> PaddedObjectMonitor;
|
|||
declare_toplevel_type(OSThread) \
|
||||
declare_toplevel_type(JavaFrameAnchor) \
|
||||
\
|
||||
declare_toplevel_type(ThreadsSMRSupport) \
|
||||
declare_toplevel_type(ThreadsList) \
|
||||
\
|
||||
/***************/ \
|
||||
/* Interpreter */ \
|
||||
/***************/ \
|
||||
|
@ -1964,6 +1970,7 @@ typedef PaddedEnd<ObjectMonitor> PaddedObjectMonitor;
|
|||
declare_toplevel_type(intptr_t*) \
|
||||
declare_unsigned_integer_type(InvocationCounter) /* FIXME: wrong type (not integer) */ \
|
||||
declare_toplevel_type(JavaThread*) \
|
||||
declare_toplevel_type(JavaThread *const *const) \
|
||||
declare_toplevel_type(java_lang_Class) \
|
||||
declare_integer_type(JavaThread::AsyncRequests) \
|
||||
declare_integer_type(JavaThread::TerminatedTypes) \
|
||||
|
|
|
@ -536,7 +536,8 @@ public class CommandProcessor {
|
|||
// Not an address
|
||||
boolean all = name.equals("-a");
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
if (all || bos.toString().equals(name)) {
|
||||
|
@ -898,7 +899,8 @@ public class CommandProcessor {
|
|||
String name = t.nextToken();
|
||||
boolean all = name.equals("-a");
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
if (all || bos.toString().equals(name)) {
|
||||
|
@ -927,7 +929,8 @@ public class CommandProcessor {
|
|||
String name = t.nextToken();
|
||||
boolean all = name.equals("-a");
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
if (all || bos.toString().equals(name)) {
|
||||
|
@ -954,7 +957,8 @@ public class CommandProcessor {
|
|||
String name = t.nextToken();
|
||||
boolean all = name.equals("-a");
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
if (all || bos.toString().equals(name)) {
|
||||
|
@ -1437,7 +1441,8 @@ public class CommandProcessor {
|
|||
final long stride = VM.getVM().getAddressSize();
|
||||
if (type.equals("threads")) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
Address base = thread.getStackBase();
|
||||
Address end = thread.getLastJavaSP();
|
||||
if (end == null) continue;
|
||||
|
@ -1561,7 +1566,8 @@ public class CommandProcessor {
|
|||
String name = t.nextToken();
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
boolean all = name.equals("-a");
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
if (all || bos.toString().equals(name)) {
|
||||
|
@ -1590,7 +1596,8 @@ public class CommandProcessor {
|
|||
String name = t.nextToken();
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
boolean all = name.equals("-a");
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
if (all || bos.toString().equals(name)) {
|
||||
|
@ -1613,7 +1620,8 @@ public class CommandProcessor {
|
|||
usage();
|
||||
} else {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
thread.printThreadIDOn(out);
|
||||
out.println(" " + thread.getThreadName());
|
||||
thread.printInfoOn(out);
|
||||
|
@ -1631,7 +1639,8 @@ public class CommandProcessor {
|
|||
ArrayList nmethods = new ArrayList();
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
HTMLGenerator gen = new HTMLGenerator(false);
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
try {
|
||||
for (JavaVFrame vf = thread.getLastJavaVFrameDbg(); vf != null; vf = vf.javaSender()) {
|
||||
if (vf instanceof CompiledVFrame) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -619,10 +619,10 @@ public class BsdDebuggerLocal extends DebuggerBase implements BsdDebugger {
|
|||
Threads threads = VM.getVM().getThreads();
|
||||
int len = threads.getNumberOfThreads();
|
||||
long[] result = new long[len * 3]; // triple
|
||||
JavaThread t = threads.first();
|
||||
long beg, end;
|
||||
int i = 0;
|
||||
while (t != null) {
|
||||
for (int k = 0; k < threads.getNumberOfThreads(); k++) {
|
||||
JavaThread t = threads.getJavaThreadAt(k);
|
||||
end = t.getStackBaseValue();
|
||||
beg = end - t.getStackSize();
|
||||
BsdThread bsdt = (BsdThread)t.getThreadProxy();
|
||||
|
@ -631,7 +631,6 @@ public class BsdDebuggerLocal extends DebuggerBase implements BsdDebugger {
|
|||
result[i] = uid;
|
||||
result[i + 1] = beg;
|
||||
result[i + 2] = end;
|
||||
t = t.next();
|
||||
i += 3;
|
||||
}
|
||||
return result;
|
||||
|
|
|
@ -357,7 +357,9 @@ public class ObjectHeap {
|
|||
// end.
|
||||
|
||||
if (VM.getVM().getUseTLAB()) {
|
||||
for (JavaThread thread = VM.getVM().getThreads().first(); thread != null; thread = thread.next()) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ThreadLocalAllocBuffer tlab = thread.tlab();
|
||||
if (tlab.start() != null) {
|
||||
if ((tlab.top() == null) || (tlab.end() == null)) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -146,7 +146,9 @@ public class DeadlockDetector {
|
|||
|
||||
private static void createThreadTable() {
|
||||
threadTable = new HashMap();
|
||||
for (JavaThread cur = threads.first(); cur != null; cur = cur.next()) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread cur = threads.getJavaThreadAt(i);
|
||||
// initialize dfn for each thread to -1
|
||||
threadTable.put(cur, new Integer(-1));
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -41,7 +41,6 @@ import sun.jvm.hotspot.utilities.*;
|
|||
public class JavaThread extends Thread {
|
||||
private static final boolean DEBUG = System.getProperty("sun.jvm.hotspot.runtime.JavaThread.DEBUG") != null;
|
||||
|
||||
private static AddressField nextField;
|
||||
private static sun.jvm.hotspot.types.OopField threadObjField;
|
||||
private static AddressField anchorField;
|
||||
private static AddressField lastJavaSPField;
|
||||
|
@ -84,7 +83,6 @@ public class JavaThread extends Thread {
|
|||
Type type = db.lookupType("JavaThread");
|
||||
Type anchorType = db.lookupType("JavaFrameAnchor");
|
||||
|
||||
nextField = type.getAddressField("_next");
|
||||
threadObjField = type.getOopField("_threadObj");
|
||||
anchorField = type.getAddressField("_anchor");
|
||||
lastJavaSPField = anchorType.getAddressField("_last_Java_sp");
|
||||
|
@ -120,15 +118,6 @@ public class JavaThread extends Thread {
|
|||
this.access = access;
|
||||
}
|
||||
|
||||
public JavaThread next() {
|
||||
Address threadAddr = nextField.getValue(addr);
|
||||
if (threadAddr == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return VM.getVM().getThreads().createJavaThreadWrapper(threadAddr);
|
||||
}
|
||||
|
||||
/** NOTE: for convenience, this differs in definition from the underlying VM.
|
||||
Only "pure" JavaThreads return true; CompilerThreads, the CodeCacheSweeperThread,
|
||||
JVMDIDebuggerThreads return false.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -42,12 +42,41 @@ import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess;
|
|||
import sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
|
||||
class ThreadsList extends VMObject {
|
||||
private static AddressField threadsField;
|
||||
private static CIntegerField lengthField;
|
||||
|
||||
static {
|
||||
VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase()));
|
||||
}
|
||||
|
||||
private static synchronized void initialize(TypeDataBase db) {
|
||||
Type type = db.lookupType("ThreadsList");
|
||||
lengthField = type.getCIntegerField("_length");
|
||||
threadsField = type.getAddressField("_threads");
|
||||
}
|
||||
|
||||
public Address getJavaThreadAddressAt(int i) {
|
||||
Address threadAddr = threadsField.getValue(addr);
|
||||
Address at = threadAddr.getAddressAt(VM.getVM().getAddressSize() * i);
|
||||
return at;
|
||||
}
|
||||
|
||||
public long length() {
|
||||
return lengthField.getValue(addr);
|
||||
}
|
||||
|
||||
public ThreadsList(Address addr) {
|
||||
super(addr);
|
||||
}
|
||||
}
|
||||
|
||||
public class Threads {
|
||||
private static JavaThreadFactory threadFactory;
|
||||
private static AddressField threadListField;
|
||||
private static CIntegerField numOfThreadsField;
|
||||
private static VirtualConstructor virtualConstructor;
|
||||
private static JavaThreadPDAccess access;
|
||||
private static ThreadsList _list;
|
||||
|
||||
static {
|
||||
VM.registerVMInitializedObserver(new Observer() {
|
||||
|
@ -58,10 +87,8 @@ public class Threads {
|
|||
}
|
||||
|
||||
private static synchronized void initialize(TypeDataBase db) {
|
||||
Type type = db.lookupType("Threads");
|
||||
|
||||
threadListField = type.getAddressField("_thread_list");
|
||||
numOfThreadsField = type.getCIntegerField("_number_of_threads");
|
||||
Type type = db.lookupType("ThreadsSMRSupport");
|
||||
threadListField = type.getAddressField("_java_thread_list");
|
||||
|
||||
// Instantiate appropriate platform-specific JavaThreadFactory
|
||||
String os = VM.getVM().getOS();
|
||||
|
@ -134,6 +161,7 @@ public class Threads {
|
|||
}
|
||||
|
||||
public Threads() {
|
||||
_list = VMObjectFactory.newObject(ThreadsList.class, threadListField.getValue());
|
||||
}
|
||||
|
||||
/** NOTE: this returns objects of type JavaThread, CompilerThread,
|
||||
|
@ -147,17 +175,15 @@ public class Threads {
|
|||
false for the three subclasses. FIXME: should reconsider the
|
||||
inheritance hierarchy; see {@link
|
||||
sun.jvm.hotspot.runtime.JavaThread#isJavaThread}. */
|
||||
public JavaThread first() {
|
||||
Address threadAddr = threadListField.getValue();
|
||||
if (threadAddr == null) {
|
||||
return null;
|
||||
public JavaThread getJavaThreadAt(int i) {
|
||||
if (i < _list.length()) {
|
||||
return createJavaThreadWrapper(_list.getJavaThreadAddressAt(i));
|
||||
}
|
||||
|
||||
return createJavaThreadWrapper(threadAddr);
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getNumberOfThreads() {
|
||||
return (int) numOfThreadsField.getValue();
|
||||
return (int) _list.length();
|
||||
}
|
||||
|
||||
/** Routine for instantiating appropriately-typed wrapper for a
|
||||
|
@ -177,7 +203,9 @@ public class Threads {
|
|||
/** Memory operations */
|
||||
public void oopsDo(AddressVisitor oopVisitor) {
|
||||
// FIXME: add more of VM functionality
|
||||
for (JavaThread thread = first(); thread != null; thread = thread.next()) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
thread.oopsDo(oopVisitor);
|
||||
}
|
||||
}
|
||||
|
@ -185,15 +213,17 @@ public class Threads {
|
|||
// refer to Threads::owning_thread_from_monitor_owner
|
||||
public JavaThread owningThreadFromMonitor(Address o) {
|
||||
if (o == null) return null;
|
||||
for (JavaThread thread = first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < getNumberOfThreads(); i++) {
|
||||
JavaThread thread = getJavaThreadAt(i);
|
||||
if (o.equals(thread.threadObjectAddress())) {
|
||||
return thread;
|
||||
}
|
||||
}
|
||||
|
||||
for (JavaThread thread = first(); thread != null; thread = thread.next()) {
|
||||
if (thread.isLockOwned(o))
|
||||
return thread;
|
||||
for (int i = 0; i < getNumberOfThreads(); i++) {
|
||||
JavaThread thread = getJavaThreadAt(i);
|
||||
if (thread.isLockOwned(o))
|
||||
return thread;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -206,7 +236,8 @@ public class Threads {
|
|||
// Get list of Java threads that are waiting to enter the specified monitor.
|
||||
public List getPendingThreads(ObjectMonitor monitor) {
|
||||
List pendingThreads = new ArrayList();
|
||||
for (JavaThread thread = first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < getNumberOfThreads(); i++) {
|
||||
JavaThread thread = getJavaThreadAt(i);
|
||||
if (thread.isCompilerThread() || thread.isCodeCacheSweeperThread()) {
|
||||
continue;
|
||||
}
|
||||
|
@ -221,7 +252,8 @@ public class Threads {
|
|||
// Get list of Java threads that have called Object.wait on the specified monitor.
|
||||
public List getWaitingThreads(ObjectMonitor monitor) {
|
||||
List pendingThreads = new ArrayList();
|
||||
for (JavaThread thread = first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < getNumberOfThreads(); i++) {
|
||||
JavaThread thread = getJavaThreadAt(i);
|
||||
ObjectMonitor waiting = thread.getCurrentWaitingMonitor();
|
||||
if (monitor.equals(waiting)) {
|
||||
pendingThreads.add(thread);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -201,7 +201,8 @@ public class PStack extends Tool {
|
|||
jframeCache = new HashMap();
|
||||
proxyToThread = new HashMap();
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread cur = threads.first(); cur != null; cur = cur.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread cur = threads.getJavaThreadAt(i);
|
||||
List tmp = new ArrayList(10);
|
||||
try {
|
||||
for (JavaVFrame vf = cur.getLastJavaVFrameDbg(); vf != null; vf = vf.javaSender()) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -71,8 +71,8 @@ public class StackTrace extends Tool {
|
|||
concLocksPrinter = new ConcurrentLocksPrinter();
|
||||
}
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
int i = 1;
|
||||
for (JavaThread cur = threads.first(); cur != null; cur = cur.next(), i++) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread cur = threads.getJavaThreadAt(i);
|
||||
if (cur.isJavaThread()) {
|
||||
cur.printThreadInfoOn(tty);
|
||||
try {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -459,12 +459,13 @@ public class JavaThreadsPanel extends SAPanel implements ActionListener {
|
|||
}
|
||||
|
||||
private void cache() {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (JavaThread t = threads.first(); t != null; t = t.next()) {
|
||||
if (t.isJavaThread()) {
|
||||
cachedThreads.add(new CachedThread(t));
|
||||
}
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread t = threads.getJavaThreadAt(i);
|
||||
if (t.isJavaThread()) {
|
||||
cachedThreads.add(new CachedThread(t));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void decache() {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -129,15 +129,12 @@ public abstract class AbstractHeapGraphWriter implements HeapGraphWriter {
|
|||
|
||||
protected void writeJavaThreads() throws IOException {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
JavaThread jt = threads.first();
|
||||
int index = 1;
|
||||
while (jt != null) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread jt = threads.getJavaThreadAt(i);
|
||||
if (jt.getThreadObj() != null) {
|
||||
// Note that the thread serial number range is 1-to-N
|
||||
writeJavaThread(jt, index);
|
||||
index++;
|
||||
writeJavaThread(jt, i + 1);
|
||||
}
|
||||
jt = jt.next();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -708,8 +708,8 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||
int frameSerialNum = 0;
|
||||
int numThreads = 0;
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
|
||||
for (JavaThread thread = threads.first(); thread != null; thread = thread.next()) {
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
Oop threadObj = thread.getThreadObj();
|
||||
if (threadObj != null && !thread.isExiting() && !thread.isHiddenFromExternalView()) {
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -56,7 +56,9 @@ public class PointerFinder {
|
|||
|
||||
if (VM.getVM().getUseTLAB()) {
|
||||
// Try to find thread containing it
|
||||
for (JavaThread t = VM.getVM().getThreads().first(); t != null; t = t.next()) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread t = threads.getJavaThreadAt(i);
|
||||
ThreadLocalAllocBuffer tlab = t.tlab();
|
||||
if (tlab.contains(a)) {
|
||||
loc.inTLAB = true;
|
||||
|
@ -125,7 +127,9 @@ public class PointerFinder {
|
|||
return loc;
|
||||
}
|
||||
// Look in thread-local handles
|
||||
for (JavaThread t = VM.getVM().getThreads().first(); t != null; t = t.next()) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread t = threads.getJavaThreadAt(i);
|
||||
JNIHandleBlock handleBlock = t.activeHandles();
|
||||
if (handleBlock != null) {
|
||||
handleBlock = handleBlock.blockContainingHandle(a);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -92,9 +92,9 @@ public class ReversePtrsAnalysis {
|
|||
heap = vm.getObjectHeap();
|
||||
|
||||
// Do each thread's roots
|
||||
for (JavaThread thread = VM.getVM().getThreads().first();
|
||||
thread != null;
|
||||
thread = thread.next()) {
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
thread.printThreadIDOn(new PrintStream(bos));
|
||||
String threadDesc =
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -189,12 +189,12 @@ public class JSJavaVM extends DefaultScriptObject {
|
|||
|
||||
private synchronized JSList getThreads() {
|
||||
if (threadsCache == null) {
|
||||
List threads = new ArrayList(0);
|
||||
threadsCache = factory.newJSList(threads);
|
||||
JavaThread jthread = vm.getThreads().first();
|
||||
while (jthread != null) {
|
||||
threads.add(jthread);
|
||||
jthread = jthread.next();
|
||||
List threadsList = new ArrayList(0);
|
||||
threadsCache = factory.newJSList(threadsList);
|
||||
Threads threads = VM.getVM().getThreads();
|
||||
for (int i = 0; i < threads.getNumberOfThreads(); i++) {
|
||||
JavaThread thread = threads.getJavaThreadAt(i);
|
||||
threadsList.add(thread);
|
||||
}
|
||||
}
|
||||
return threadsCache;
|
||||
|
|
|
@ -55,7 +55,6 @@ public class ClhsdbField {
|
|||
"field InstanceKlass _methods Array<Method*>*",
|
||||
"field InstanceKlass _constants ConstantPool*",
|
||||
"field Klass _name Symbol*",
|
||||
"field JavaThread _next JavaThread*",
|
||||
"field JavaThread _osthread OSThread*",
|
||||
"field JVMState _bci",
|
||||
"field TenuredGeneration _the_space ContiguousSpace*",
|
||||
|
|
|
@ -68,8 +68,7 @@ public class ClhsdbPrintStatics {
|
|||
"SystemDictionary::Object_klass_knum"));
|
||||
expStrMap.put("printstatics Threads", List.of(
|
||||
"Static fields of Threads",
|
||||
"_number_of_threads", "_number_of_non_daemon_threads",
|
||||
"JavaThread\\* Threads"));
|
||||
"_number_of_threads", "_number_of_non_daemon_threads"));
|
||||
expStrMap.put("printstatics Universe", List.of(
|
||||
"Static fields of Universe",
|
||||
"uintptr_t Universe::_verify_oop_mask",
|
||||
|
|
|
@ -57,7 +57,6 @@ public class ClhsdbVmStructsDump {
|
|||
"field Klass _name Symbol*",
|
||||
"type ClassLoaderData* null",
|
||||
"type DictionaryEntry KlassHashtableEntry",
|
||||
"field JavaThread _next JavaThread*",
|
||||
"field JavaThread _osthread OSThread*",
|
||||
"type TenuredGeneration CardGeneration",
|
||||
"field JVMState _bci",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue