diff --git a/DevGuide.md b/DevGuide.md index addc98bdcd..f90038fe90 100644 --- a/DevGuide.md +++ b/DevGuide.md @@ -30,11 +30,11 @@ This guide includes instructions for obtaining many of these at the relevant ste You may not need all of these, depending on which portions you are building or developing. #### At minimum you will need all of the following * Java JDK 11 (64-bit) - Free long term support (LTS) versions of JDK 11 are provided by: - - AdoptOpenJDK - - https://adoptopenjdk.net/releases.html?variant=openjdk11&jvmVariant=hotspot + - Adoptium Temurin + - https://adoptium.net/releases.html?variant=openjdk11&jvmVariant=hotspot - Amazon Corretto - https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html -* Gradle 6.0 or later - We use version 6.9, and tested with up to 7.0.1. +* Gradle 6 or 7 - https://gradle.org/releases/ * A C/C++ compiler - We use GCC on Linux, Xcode (Clang) on macOS, and Visual Studio (2017 or later) on Windows. - https://gcc.gnu.org/ diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceDataAdapter.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceDataAdapter.java index e1d5f36262..8cb156ba89 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceDataAdapter.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceDataAdapter.java @@ -24,6 +24,7 @@ import ghidra.program.model.symbol.RefType; import ghidra.program.model.symbol.SourceType; import ghidra.trace.database.data.DBTraceDataSettingsOperations; import ghidra.trace.database.symbol.DBTraceReference; +import ghidra.trace.model.Trace.TraceCodeChangeType; import ghidra.trace.model.listing.TraceData; import ghidra.trace.model.symbol.TraceReference; import ghidra.trace.util.*; @@ -38,150 +39,198 @@ public interface DBTraceDataAdapter extends DBTraceCodeUnitAdapter, DataAdapterM @Override default TraceReference[] getValueReferences() { - return (TraceReference[]) DataAdapterMinimal.super.getValueReferences(); + try (LockHold hold = getTrace().lockRead()) { + return (TraceReference[]) DataAdapterMinimal.super.getValueReferences(); + } } @Override default void addValueReference(Address refAddr, RefType type) { - getTrace().getReferenceManager() - .addMemoryReference(getLifespan(), getAddress(), refAddr, - type, SourceType.USER_DEFINED, DATA_OP_INDEX); + try (LockHold hold = getTrace().lockWrite()) { + getTrace().getReferenceManager() + .addMemoryReference(getLifespan(), getAddress(), refAddr, + type, SourceType.USER_DEFINED, DATA_OP_INDEX); + } } @Override default void removeValueReference(Address refAddr) { - DBTraceReference ref = getTrace().getReferenceManager() - .getReference(getStartSnap(), - getAddress(), refAddr, DATA_OP_INDEX); - if (ref == null) { - return; + try (LockHold hold = getTrace().lockWrite()) { + DBTraceReference ref = getTrace().getReferenceManager() + .getReference(getStartSnap(), + getAddress(), refAddr, DATA_OP_INDEX); + if (ref == null) { + return; + } + ref.delete(); } - ref.delete(); } DBTraceDataSettingsOperations getSettingsSpace(boolean createIfAbsent); @Override default void setLong(String name, long value) { - getSettingsSpace(true).setLong(getLifespan(), getAddress(), name, value); + try (LockHold hold = getTrace().lockWrite()) { + getSettingsSpace(true).setLong(getLifespan(), getAddress(), name, value); + } + getTrace().setChanged(new TraceChangeRecord<>( + TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null, + null)); } @Override default Long getLong(String name) { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space != null) { - Long value = space.getLong(getStartSnap(), getAddress(), name); - if (value != null) { - return value; + try (LockHold hold = getTrace().lockRead()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space != null) { + Long value = space.getLong(getStartSnap(), getAddress(), name); + if (value != null) { + return value; + } } + Settings defaultSettings = getDefaultSettings(); + return defaultSettings == null ? null : defaultSettings.getLong(name); } - Settings defaultSettings = getDefaultSettings(); - return defaultSettings == null ? null : defaultSettings.getLong(name); } @Override default void setString(String name, String value) { - getSettingsSpace(true).setString(getLifespan(), getAddress(), name, value); + try (LockHold hold = getTrace().lockWrite()) { + getSettingsSpace(true).setString(getLifespan(), getAddress(), name, value); + } + getTrace().setChanged(new TraceChangeRecord<>( + TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null, + null)); } @Override default String getString(String name) { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space != null) { - String value = space.getString(getStartSnap(), getAddress(), name); - if (value != null) { - return value; + try (LockHold hold = getTrace().lockRead()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space != null) { + String value = space.getString(getStartSnap(), getAddress(), name); + if (value != null) { + return value; + } } + Settings defaultSettings = getDefaultSettings(); + return defaultSettings == null ? null : defaultSettings.getString(name); } - Settings defaultSettings = getDefaultSettings(); - return defaultSettings == null ? null : defaultSettings.getString(name); } @Override default void setByteArray(String name, byte[] value) { - getSettingsSpace(true).setBytes(getLifespan(), getAddress(), name, value); + try (LockHold hold = getTrace().lockWrite()) { + getSettingsSpace(true).setBytes(getLifespan(), getAddress(), name, value); + } + getTrace().setChanged(new TraceChangeRecord<>( + TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null, + null)); } @Override default byte[] getByteArray(String name) { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space != null) { - byte[] value = space.getBytes(getStartSnap(), getAddress(), name); - if (value != null) { - return value; + try (LockHold hold = getTrace().lockRead()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space != null) { + byte[] value = space.getBytes(getStartSnap(), getAddress(), name); + if (value != null) { + return value; + } } + Settings defaultSettings = getDefaultSettings(); + return defaultSettings == null ? null : defaultSettings.getByteArray(name); } - Settings defaultSettings = getDefaultSettings(); - return defaultSettings == null ? null : defaultSettings.getByteArray(name); } @Override default void setValue(String name, Object value) { - getSettingsSpace(true).setValue(getLifespan(), getAddress(), name, value); + try (LockHold hold = getTrace().lockWrite()) { + getSettingsSpace(true).setValue(getLifespan(), getAddress(), name, value); + } + getTrace().setChanged(new TraceChangeRecord<>( + TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null, + null)); } @Override default Object getValue(String name) { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space != null) { - Object value = space.getValue(getStartSnap(), getAddress(), name); - if (value != null) { - return value; + try (LockHold hold = getTrace().lockRead()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space != null) { + Object value = space.getValue(getStartSnap(), getAddress(), name); + if (value != null) { + return value; + } } + Settings defaultSettings = getDefaultSettings(); + return defaultSettings == null ? null : defaultSettings.getValue(name); } - Settings defaultSettings = getDefaultSettings(); - return defaultSettings == null ? null : defaultSettings.getValue(name); } @Override default void clearSetting(String name) { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space == null) { - return; + try (LockHold hold = getTrace().lockWrite()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space == null) { + return; + } + space.clear(getLifespan(), getAddress(), name); } - space.clear(getLifespan(), getAddress(), name); + getTrace().setChanged(new TraceChangeRecord<>( + TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null, + null)); } @Override default void clearAllSettings() { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space == null) { - return; + try (LockHold hold = getTrace().lockWrite()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space == null) { + return; + } + space.clear(getLifespan(), getAddress(), null); } - space.clear(getLifespan(), getAddress(), null); + getTrace().setChanged(new TraceChangeRecord<>( + TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null, + null)); } @Override default String[] getNames() { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space == null) { - return EMPTY_STRING_ARRAY; + try (LockHold hold = getTrace().lockRead()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space == null) { + return EMPTY_STRING_ARRAY; + } + Collection names = space.getSettingNames(getLifespan(), getAddress()); + return names.toArray(new String[names.size()]); } - Collection names = space.getSettingNames(getLifespan(), getAddress()); - return names.toArray(new String[names.size()]); } @Override default boolean isEmpty() { - DBTraceDataSettingsOperations space = getSettingsSpace(false); - if (space == null) { - return true; + try (LockHold hold = getTrace().lockRead()) { + DBTraceDataSettingsOperations space = getSettingsSpace(false); + if (space == null) { + return true; + } + return space.isEmpty(getLifespan(), getAddress()); } - return space.isEmpty(getLifespan(), getAddress()); } @Override default T getSettingsDefinition( Class settingsDefinitionClass) { - try (LockHold hold = LockHold.lock(getTrace().getReadWriteLock().readLock())) { + try (LockHold hold = getTrace().lockRead()) { return DataAdapterFromSettings.super.getSettingsDefinition(settingsDefinitionClass); } } @Override default boolean hasMutability(int mutabilityType) { - try (LockHold hold = LockHold.lock(getTrace().getReadWriteLock().readLock())) { + try (LockHold hold = getTrace().lockRead()) { return DataAdapterFromSettings.super.hasMutability(mutabilityType); } } diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceInstruction.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceInstruction.java index f7e1db5dfd..6812ecf3a5 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceInstruction.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceInstruction.java @@ -40,6 +40,7 @@ import ghidra.trace.model.listing.TraceInstruction; import ghidra.trace.model.symbol.TraceReference; import ghidra.trace.util.*; import ghidra.util.LockHold; +import ghidra.util.Msg; import ghidra.util.database.DBCachedObjectStore; import ghidra.util.database.DBObjectColumn; import ghidra.util.database.annot.*; @@ -139,8 +140,10 @@ public class DBTraceInstruction extends AbstractDBTraceCodeUnit> FLOWOVERRIDE_SHIFT]; diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/program/DBTraceProgramView.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/program/DBTraceProgramView.java index 86bea1494a..d9077ccc6f 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/program/DBTraceProgramView.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/program/DBTraceProgramView.java @@ -109,6 +109,8 @@ public class DBTraceProgramView implements TraceProgramView { listenFor(TraceCodeChangeType.REMOVED, this::codeRemoved); listenFor(TraceCodeChangeType.FRAGMENT_CHANGED, this::codeFragmentChanged); listenFor(TraceCodeChangeType.DATA_TYPE_REPLACED, this::codeDataTypeReplaced); + listenFor(TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, + this::codeDataTypeSettingsChanged); listenFor(TraceCommentChangeType.EOL_CHANGED, this::commentEolChanged); listenFor(TraceCommentChangeType.PLATE_CHANGED, this::commentPlateChanged); @@ -330,10 +332,21 @@ public class DBTraceProgramView implements TraceProgramView { if (queues == null) { return; } - queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_CODE_REPLACED, + queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REPLACED, range.getX1(), range.getX2(), null, null, null)); } + private void codeDataTypeSettingsChanged(TraceAddressSpace space, + TraceAddressSnapRange range) { + DomainObjectEventQueues queues = isVisible(space, range); + if (queues == null) { + return; + } + // Yes, x1 twice + queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_SETTING_CHANGED, + range.getX1(), range.getX1(), null, null, null)); + } + private void commentChanged(int docrType, TraceAddressSpace space, TraceAddressSnapRange range, String oldValue, String newValue) { diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/Trace.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/Trace.java index 1f0dc98802..3b524d2931 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/Trace.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/Trace.java @@ -106,6 +106,8 @@ public interface Trace extends DataTypeManagerDomainObject { // Long is data type ID public static final TraceCodeChangeType DATA_TYPE_REPLACED = new TraceCodeChangeType<>(); + public static final TraceCodeChangeType DATA_TYPE_SETTINGS_CHANGED = + new TraceCodeChangeType<>(); } public static final class TraceCommentChangeType diff --git a/GhidraDocs/InstallationGuide.html b/GhidraDocs/InstallationGuide.html index 6d17e78aa6..811fc7dfad 100644 --- a/GhidraDocs/InstallationGuide.html +++ b/GhidraDocs/InstallationGuide.html @@ -86,8 +86,8 @@ Ghidra team if you have a specific need.

  • Free long term support (LTS) versions of JDK 11 are provided by: