diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DefaultTraceTimeViewport.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DefaultTraceTimeViewport.java index a78a04dbef..7e35661613 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DefaultTraceTimeViewport.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DefaultTraceTimeViewport.java @@ -186,12 +186,14 @@ public class DefaultTraceTimeViewport implements TraceTimeViewport { } protected boolean isLower(long lower) { - synchronized (ordered) { - Range range = spanSet.rangeContaining(lower); - if (range == null) { - return false; + try (LockHold hold = trace.lockRead()) { // May not be necessary + synchronized (ordered) { + Range range = spanSet.rangeContaining(lower); + if (range == null) { + return false; + } + return range.lowerEndpoint().longValue() == lower; } - return range.lowerEndpoint().longValue() == lower; } } @@ -262,12 +264,12 @@ public class DefaultTraceTimeViewport implements TraceTimeViewport { List> ordered = new ArrayList<>(); try (LockHold hold = trace.lockRead()) { collectForkRanges(trace.getTimeManager(), snap, spanSet, ordered); - } - synchronized (this.ordered) { - this.spanSet.clear(); - this.ordered.clear(); - this.spanSet.addAll(spanSet); - this.ordered.addAll(ordered); + synchronized (this.ordered) { + this.spanSet.clear(); + this.ordered.clear(); + this.spanSet.addAll(spanSet); + this.ordered.addAll(ordered); + } } assert !ordered.isEmpty(); changeListeners.fire.run(); @@ -322,41 +324,51 @@ public class DefaultTraceTimeViewport implements TraceTimeViewport { @Override public boolean isForked() { - synchronized (ordered) { - return ordered.size() > 1; + try (LockHold hold = trace.lockRead()) { // May not be necessary + synchronized (ordered) { + return ordered.size() > 1; + } } } public List> getOrderedSpans() { - synchronized (ordered) { - return List.copyOf(ordered); + try (LockHold hold = trace.lockRead()) { // May not be necessary + synchronized (ordered) { + return List.copyOf(ordered); + } } } public List> getOrderedSpans(long snap) { - synchronized (ordered) { - setSnap(snap); - return getOrderedSpans(); + try (LockHold hold = trace.lockRead()) { // setSnap requires this + synchronized (ordered) { + setSnap(snap); + return getOrderedSpans(); + } } } @Override public List getOrderedSnaps() { - synchronized (ordered) { - return ordered - .stream() - .map(Range::upperEndpoint) - .collect(Collectors.toList()); + try (LockHold hold = trace.lockRead()) { // May not be necessary + synchronized (ordered) { + return ordered + .stream() + .map(Range::upperEndpoint) + .collect(Collectors.toList()); + } } } @Override public List getReversedSnaps() { - synchronized (ordered) { - return Lists.reverse(ordered) - .stream() - .map(Range::upperEndpoint) - .collect(Collectors.toList()); + try (LockHold hold = trace.lockRead()) { // May not be necessary + synchronized (ordered) { + return Lists.reverse(ordered) + .stream() + .map(Range::upperEndpoint) + .collect(Collectors.toList()); + } } }