diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java index 3c7c5b71fb..2c75a08692 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java @@ -123,7 +123,11 @@ public class DbgManagerImpl implements DbgManager { public DbgThreadImpl getThreadComputeIfAbsent(DebugThreadId id, DbgProcessImpl process, int tid) { synchronized (threads) { - return threads.computeIfAbsent(id, i -> new DbgThreadImpl(this, process, id, tid)); + if (!threads.containsKey(id)) { + DbgThreadImpl thread = new DbgThreadImpl(this, process, id, tid); + thread.add(); + } + return threads.get(id); } } @@ -188,7 +192,11 @@ public class DbgManagerImpl implements DbgManager { public DbgProcessImpl getProcessComputeIfAbsent(DebugProcessId id, int pid) { synchronized (processes) { - return processes.computeIfAbsent(id, i -> new DbgProcessImpl(this, id, pid)); + if (!processes.containsKey(id)) { + DbgProcessImpl process = new DbgProcessImpl(this, id, pid); + process.add(); + } + return processes.get(id); } } @@ -221,7 +229,11 @@ public class DbgManagerImpl implements DbgManager { public DbgSessionImpl getSessionComputeIfAbsent(DebugSessionId id) { synchronized (sessions) { - return sessions.computeIfAbsent(id, i -> new DbgSessionImpl(this, id)); + if (!sessions.containsKey(id)) { + DbgSessionImpl session = new DbgSessionImpl(this, id); + session.add(); + } + return sessions.get(id); } } @@ -720,7 +732,7 @@ public class DbgManagerImpl implements DbgManager { so.setCurrentProcessId(id); int pid = so.getCurrentProcessSystemId(); DbgProcessImpl proc = new DbgProcessImpl(this, id, pid); - proc.add(evt.getCause()); + proc.add(); getEventListeners().fire.processAdded(proc, evt.getCause()); getEventListeners().fire.processSelected(proc, evt.getCause()); @@ -1325,50 +1337,62 @@ public class DbgManagerImpl implements DbgManager { } public DbgThreadImpl getCurrentThread() { - DebugEventInformation info = getLastEventInformation(); - if (info == null) { - return null; + synchronized (threads) { + DebugEventInformation info = getLastEventInformation(); + if (info == null) { + return null; + } + DebugSystemObjects so = getSystemObjects(); + int tid = so.getCurrentThreadSystemId(); + if (tid < 0) { + return null; + } + return threads.get(info.getThreadId()); } - DebugSystemObjects so = getSystemObjects(); - int tid = so.getCurrentThreadSystemId(); - if (tid < 0) { - return null; - } - return threads.get(info.getThreadId()); } public DbgProcessImpl getCurrentProcess() { - DebugEventInformation info = getLastEventInformation(); - if (info == null) { - return null; + synchronized (processes) { + DebugEventInformation info = getLastEventInformation(); + if (info == null) { + return null; + } + return processes.get(info.getProcessId()); } - return processes.get(info.getProcessId()); } public DbgSessionImpl getCurrentSession() { - DebugEventInformation info = getLastEventInformation(); - if (info == null) { - return null; + synchronized (sessions) { + DebugEventInformation info = getLastEventInformation(); + if (info == null) { + return null; + } + return sessions.get(info.getSessionId()); } - return sessions.get(info.getSessionId()); } public DbgThreadImpl getEventThread() { - DebugSystemObjects so = getSystemObjects(); - DebugThreadId id = so.getEventThread(); - return threads.get(id); + synchronized (threads) { + DebugSystemObjects so = getSystemObjects(); + DebugThreadId id = so.getEventThread(); + return threads.get(id); + } } public DbgProcessImpl getEventProcess() { - DebugSystemObjects so = getSystemObjects(); - DebugProcessId id = so.getEventProcess(); - return processes.get(id); + synchronized (processes) { + DebugSystemObjects so = getSystemObjects(); + DebugProcessId id = so.getEventProcess(); + return processes.get(id); + } } public DbgSessionImpl getEventSession() { - DebugSystemObjects so = getSystemObjects(); - DebugSessionId id = so.getEventSystem(); - return sessions.get(id); + synchronized (sessions) { + DebugSystemObjects so = getSystemObjects(); + DebugSessionId id = so.getEventSystem(); + return sessions.get(id); + } } public CompletableFuture selectThread(DbgThreadImpl thread) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java index aea223b616..d12c298dbb 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java @@ -63,8 +63,6 @@ public class DbgProcessImpl implements DbgProcess { this.manager = manager; this.id = id; this.pid = pid; - manager.processes.put(id, this); - manager.getEventListeners().fire.processAdded(this, DbgCause.Causes.UNCLAIMED); } public DbgProcessImpl(DbgManagerImpl manager) { @@ -109,7 +107,9 @@ public class DbgProcessImpl implements DbgProcess { * * @param cause the cause of the new inferior */ - public void add(DbgCause cause) { + public void add() { + manager.processes.put(id, this); + manager.getEventListeners().fire.processAdded(this, DbgCause.Causes.UNCLAIMED); //manager.addProcess(this, cause); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgSessionImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgSessionImpl.java index 8f11641152..74cdab2fb8 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgSessionImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgSessionImpl.java @@ -42,8 +42,6 @@ public class DbgSessionImpl implements DbgSession { public DbgSessionImpl(DbgManagerImpl manager, DebugSessionId id) { this.manager = manager; this.id = id; - manager.sessions.put(id, this); - manager.getEventListeners().fire.sessionAdded(this, DbgCause.Causes.UNCLAIMED); } public DbgSessionImpl(DbgManagerImpl manager) { @@ -83,7 +81,9 @@ public class DbgSessionImpl implements DbgSession { * * @param cause the cause of the new inferior */ - public void add(DbgCause cause) { + public void add() { + manager.sessions.put(id, this); + manager.getEventListeners().fire.sessionAdded(this, DbgCause.Causes.UNCLAIMED); //manager.addSession(this, cause); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgThreadImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgThreadImpl.java index f19b5af591..6c0ca2b86f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgThreadImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgThreadImpl.java @@ -64,14 +64,6 @@ public class DbgThreadImpl implements DbgThread { this.process = process; this.id = id; this.tid = tid; - manager.threads.put(id, this); - manager.getEventListeners().fire.threadCreated(this, DbgCause.Causes.UNCLAIMED); - } - - public DbgThreadImpl(DbgManagerImpl manager, DbgProcessImpl process, DebugThreadId id, long tid, - DebugEventInformation info) { - this(manager, process, id, tid); - this.setInfo(info); } @Override @@ -98,6 +90,8 @@ public class DbgThreadImpl implements DbgThread { * Add this thread to the inferior and manager */ public void add() { + manager.threads.put(id, this); + manager.getEventListeners().fire.threadCreated(this, DbgCause.Causes.UNCLAIMED); process.addThread(this); state.addChangeListener((oldState, newState, pair) -> { this.manager.getEventListeners().fire.threadStateChanged(this, newState, pair.cause, diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelImpl.java index b9f2ad93f9..7dfd7430d9 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelImpl.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.util.concurrent.CompletableFuture; import agent.dbgeng.dbgeng.DebugSessionId; -import agent.dbgeng.manager.DbgCause.Causes; import agent.dbgeng.manager.DbgManager; import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgSessionImpl; @@ -51,7 +50,7 @@ public class DbgModelImpl extends AbstractDbgModel { this.root = new DbgModelTargetRootImpl(this); this.completedRoot = CompletableFuture.completedFuture(root); DbgSessionImpl s = new DbgSessionImpl((DbgManagerImpl) dbg, new DebugSessionId(0)); - s.add(Causes.UNCLAIMED); + s.add(); DbgModelTargetSessionContainer sessions = root.sessions; this.session = (DbgModelTargetSessionImpl) sessions.getTargetSession(s); } diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/manager/DbgManager2Impl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/manager/DbgManager2Impl.java index 3dce365d8e..f836df955c 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/manager/DbgManager2Impl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/manager/DbgManager2Impl.java @@ -120,14 +120,18 @@ public class DbgManager2Impl extends DbgManagerImpl { @Override public DbgProcessImpl getCurrentProcess() { - DebugProcessId id = getSystemObjects().getCurrentProcessId(); - return processes.get(id); + synchronized (processes) { + DebugProcessId id = getSystemObjects().getCurrentProcessId(); + return processes.get(id); + } } @Override public DbgThreadImpl getCurrentThread() { - DebugThreadId id = getSystemObjects().getCurrentThreadId(); - return threads.get(id); + synchronized (threads) { + DebugThreadId id = getSystemObjects().getCurrentThreadId(); + return threads.get(id); + } } }