Merge remote-tracking branch 'origin/GP-2815_Dan_watchReadLoop' into patch

This commit is contained in:
Ryan Kurtz
2022-11-16 02:02:51 -05:00
2 changed files with 18 additions and 8 deletions

View File

@@ -495,26 +495,30 @@ public enum DBTraceUtils {
Map<R, V> toPut = new HashMap<>(); Map<R, V> toPut = new HashMap<>();
for (E entry : getIntersecting(prev, next)) { for (E entry : getIntersecting(prev, next)) {
R r = getRange(entry); R r = getRange(entry);
boolean precedesMin = getLower(r).compareTo(lower) < 0; int cmpMin = getLower(r).compareTo(lower);
boolean succeedsMax = getUpper(r).compareTo(upper) > 0; int cmpMax = getUpper(r).compareTo(upper);
boolean sameVal = Objects.equals(getValue(entry), value); boolean sameVal = Objects.equals(getValue(entry), value);
if (precedesMin && succeedsMax && sameVal) { if (cmpMin <= 0 && cmpMax >= 0 && sameVal) {
return entry; // The value in this range is already set as specified return entry; // The value in this range is already set as specified
} }
remove(entry); remove(entry);
if (precedesMin) { if (cmpMin < 0) {
if (sameVal) { if (sameVal) {
// Expand the new entry to cover the one we just removed
lower = getLower(r); lower = getLower(r);
} }
else { else {
// Create a truncated entry to replace the one we just removed
toPut.put(toRange(getLower(r), prev), getValue(entry)); toPut.put(toRange(getLower(r), prev), getValue(entry));
} }
} }
if (succeedsMax) { if (cmpMax > 0) {
if (sameVal) { if (sameVal) {
// Expand the new entry to cover the one we just removed
upper = getUpper(r); upper = getUpper(r);
} }
else { else {
// Create a truncated entry to replace the one we just removed
toPut.put(toRange(next, getUpper(r)), getValue(entry)); toPut.put(toRange(next, getUpper(r)), getValue(entry));
} }
} }

View File

@@ -295,7 +295,9 @@ public class DBTraceMemorySpace
if (state == null) { if (state == null) {
throw new NullPointerException(); throw new NullPointerException();
} }
var l = new Object() {
boolean changed;
};
new AddressRangeMapSetter<Entry<TraceAddressSnapRange, TraceMemoryState>, TraceMemoryState>() { new AddressRangeMapSetter<Entry<TraceAddressSnapRange, TraceMemoryState>, TraceMemoryState>() {
@Override @Override
protected AddressRange getRange(Entry<TraceAddressSnapRange, TraceMemoryState> entry) { protected AddressRange getRange(Entry<TraceAddressSnapRange, TraceMemoryState> entry) {
@@ -324,6 +326,8 @@ public class DBTraceMemorySpace
@Override @Override
protected Entry<TraceAddressSnapRange, TraceMemoryState> put(AddressRange range, protected Entry<TraceAddressSnapRange, TraceMemoryState> put(AddressRange range,
TraceMemoryState value) { TraceMemoryState value) {
// This should not get called if the range is already the desired state
l.changed = true;
if (value != TraceMemoryState.UNKNOWN) { if (value != TraceMemoryState.UNKNOWN) {
stateMapSpace.put(new ImmutableTraceAddressSnapRange(range, snap), value); stateMapSpace.put(new ImmutableTraceAddressSnapRange(range, snap), value);
} }
@@ -331,8 +335,10 @@ public class DBTraceMemorySpace
} }
}.set(start, end, state); }.set(start, end, state);
trace.setChanged(new TraceChangeRecord<>(TraceMemoryStateChangeType.CHANGED, this, if (l.changed) {
new ImmutableTraceAddressSnapRange(start, end, snap, snap), state)); trace.setChanged(new TraceChangeRecord<>(TraceMemoryStateChangeType.CHANGED, this,
new ImmutableTraceAddressSnapRange(start, end, snap, snap), state));
}
} }
protected void checkState(TraceMemoryState state) { protected void checkState(TraceMemoryState state) {