Merge remote-tracking branch 'origin/GP-5436_Dan_torchAsyncComm--SQUASHED'

This commit is contained in:
Ryan Kurtz 2025-03-25 12:46:21 -04:00
commit 7ca36e01d9
31 changed files with 42 additions and 130 deletions

View file

@ -24,8 +24,5 @@ apply plugin: 'eclipse'
eclipse.project.name = 'Debug Debugger-isf' eclipse.project.name = 'Debug Debugger-isf'
dependencies { dependencies {
api project(':Framework-AsyncComm')
api project(':ProposedUtils') api project(':ProposedUtils')
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
} }

View file

@ -26,13 +26,13 @@ apply plugin: 'eclipse'
eclipse.project.name = 'Debug Debugger-rmi-trace' eclipse.project.name = 'Debug Debugger-rmi-trace'
dependencies { dependencies {
api project(':ProposedUtils')
api project(':Pty') api project(':Pty')
api project(':Debugger') api project(':Debugger')
api project(':Debugger-api') api project(':Debugger-api')
testImplementation project(path: ':Generic', configuration: 'testArtifacts') testImplementation project(path: ':Generic', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger', configuration: 'testArtifacts') testImplementation project(path: ':Debugger', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts') testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts')
} }

View file

@ -24,7 +24,6 @@ eclipse.project.name = 'Debug Debugger'
dependencies { dependencies {
api project(':Debugger-api') api project(':Debugger-api')
api project(':Framework-AsyncComm')
api project(':Framework-TraceModeling') api project(':Framework-TraceModeling')
api project(':Base') api project(':Base')
api project(':ByteViewer') api project(':ByteViewer')
@ -35,7 +34,6 @@ dependencies {
testImplementation project(path: ':Generic', configuration: 'testArtifacts') testImplementation project(path: ':Generic', configuration: 'testArtifacts')
testImplementation project(path: ':Base', configuration: 'testArtifacts') testImplementation project(path: ':Base', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts') testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts')
testImplementation project(path: ':Project', configuration: 'testArtifacts') testImplementation project(path: ':Project', configuration: 'testArtifacts')
} }

View file

@ -38,7 +38,6 @@ import ghidra.app.plugin.core.debug.gui.control.TargetActionTask;
import ghidra.app.services.*; import ghidra.app.services.*;
import ghidra.app.services.DebuggerControlService.ControlModeChangeListener; import ghidra.app.services.DebuggerControlService.ControlModeChangeListener;
import ghidra.async.*; import ghidra.async.*;
import ghidra.async.AsyncConfigFieldCodec.BooleanAsyncConfigFieldCodec;
import ghidra.debug.api.control.ControlMode; import ghidra.debug.api.control.ControlMode;
import ghidra.debug.api.platform.DebuggerPlatformMapper; import ghidra.debug.api.platform.DebuggerPlatformMapper;
import ghidra.debug.api.target.Target; import ghidra.debug.api.target.Target;
@ -51,6 +50,7 @@ import ghidra.framework.main.DataTreeDialog;
import ghidra.framework.model.*; import ghidra.framework.model.*;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.*;
import ghidra.framework.plugintool.AutoConfigState.BooleanAsyncConfigFieldCodec;
import ghidra.framework.plugintool.annotation.AutoConfigStateField; import ghidra.framework.plugintool.annotation.AutoConfigStateField;
import ghidra.framework.plugintool.annotation.AutoServiceConsumed; import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
import ghidra.framework.plugintool.util.PluginStatus; import ghidra.framework.plugintool.util.PluginStatus;

View file

@ -1 +0,0 @@
MODULE FILE LICENSE: lib/protobuf-java-3.21.8.jar BSD-3-GOOGLE

View file

@ -1 +0,0 @@
# Framework-AsyncComm

View file

@ -1,57 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
apply from: "${rootProject.projectDir}/gradle/javaProject.gradle"
apply from: "${rootProject.projectDir}/gradle/jacocoProject.gradle"
apply from: "${rootProject.projectDir}/gradle/javaTestProject.gradle"
apply from: "${rootProject.projectDir}/gradle/distributableGhidraModule.gradle"
apply plugin: 'eclipse'
eclipse.project.name = 'Debug Framework-AsyncComm'
dependencies {
api 'com.google.protobuf:protobuf-java:3.21.8'
api project(':Generic')
api project(':Graph')
api project(':ProposedUtils')
}
task genTestPy(type: JavaExec) {
ext.outDir = "build/testpy"
outputs.dir(outDir)
classpath(sourceSets["main"].runtimeClasspath)
classpath(sourceSets["test"].runtimeClasspath)
mainClass = "ghidra.comm.util.pyexport.GeneratePython"
args("ghidra.comm.tests.packet", outDir)
doLast {
println("NOTE: It is normal to see some export errors, since some classes are intentionally broken to test error detection")
}
}
task combineTestPySources(type: Copy) {
from(genTestPy)
from("src/main/py")
from("src/test/py")
into("build/fulltestpy")
}
// NOTE: This is defunct, and I don't care
task pyTest(type: Exec) {
inputs.files(combineTestPySources)
commandLine("python")
workingDir(inputs.files.singleFile)
args("-m", "ghidra.comm.test_packet")
}

View file

@ -1,4 +0,0 @@
##VERSION: 2.0
##MODULE IP: BSD-3-GOOGLE
Module.manifest||GHIDRA||||END|
README.md||GHIDRA||||END|

View file

@ -1,52 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.async;
import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.AutoConfigState.BooleanConfigFieldCodec;
import ghidra.framework.plugintool.AutoConfigState.ConfigFieldCodec;
public interface AsyncConfigFieldCodec {
static class GenericAsyncConfigFieldCodec<T>
implements ConfigFieldCodec<AsyncReference<T, ?>> {
private ConfigFieldCodec<T> codec;
public GenericAsyncConfigFieldCodec(ConfigFieldCodec<T> codec) {
this.codec = codec;
}
@Override
public AsyncReference<T, ?> read(SaveState state, String name,
AsyncReference<T, ?> current) {
current.set(codec.read(state, name, current.get()), null);
return current;
}
@Override
public void write(SaveState state, String name, AsyncReference<T, ?> value) {
codec.write(state, name, value.get());
}
}
static class BooleanAsyncConfigFieldCodec
extends GenericAsyncConfigFieldCodec<Boolean> {
public BooleanAsyncConfigFieldCodec() {
super(BooleanConfigFieldCodec.INSTANCE);
}
}
// TODO: Other types as needed
}

View file

@ -26,7 +26,6 @@ dependencies {
api project(':SoftwareModeling') api project(':SoftwareModeling')
api project(':Emulation') api project(':Emulation')
api project(':ProposedUtils') api project(':ProposedUtils')
api project(':Framework-AsyncComm') // for AsyncReference
annotationProcessor project(':AnnotationValidator') annotationProcessor project(':AnnotationValidator')
testImplementation project(':Base') testImplementation project(':Base')

View file

@ -0,0 +1 @@
MODULE FILE LICENSE: lib/protobuf-java-3.21.8.jar BSD-3-GOOGLE

View file

@ -24,6 +24,7 @@ eclipse.project.name = 'Debug ProposedUtils'
// val autoServiceVersion = "1.0-rc5" // val autoServiceVersion = "1.0-rc5"
dependencies { dependencies {
api 'com.google.protobuf:protobuf-java:3.21.8'
api project(':DB') api project(':DB')
api project(':Project') api project(':Project')
api project(':SoftwareModeling') api project(':SoftwareModeling')

View file

@ -1,4 +1,5 @@
##VERSION: 2.0 ##VERSION: 2.0
##MODULE IP: BSD-3-GOOGLE
Module.manifest||GHIDRA||||END| Module.manifest||GHIDRA||||END|
README.md||GHIDRA||||END| README.md||GHIDRA||||END|
build.gradle||GHIDRA||||END| build.gradle||GHIDRA||||END|

View file

@ -24,6 +24,7 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.*; import java.util.*;
import ghidra.async.AsyncReference;
import ghidra.framework.options.SaveState; import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.annotation.AutoConfigStateField; import ghidra.framework.plugintool.annotation.AutoConfigStateField;
import ghidra.framework.plugintool.annotation.AutoConfigStateField.DefaultConfigFieldCodec; import ghidra.framework.plugintool.annotation.AutoConfigStateField.DefaultConfigFieldCodec;
@ -372,6 +373,36 @@ public interface AutoConfigState {
} }
} }
static class GenericAsyncConfigFieldCodec<T>
implements ConfigFieldCodec<AsyncReference<T, ?>> {
private ConfigFieldCodec<T> codec;
public GenericAsyncConfigFieldCodec(ConfigFieldCodec<T> codec) {
this.codec = codec;
}
@Override
public AsyncReference<T, ?> read(SaveState state, String name,
AsyncReference<T, ?> current) {
current.set(codec.read(state, name, current.get()), null);
return current;
}
@Override
public void write(SaveState state, String name, AsyncReference<T, ?> value) {
codec.write(state, name, value.get());
}
}
static class BooleanAsyncConfigFieldCodec
extends GenericAsyncConfigFieldCodec<Boolean> {
public BooleanAsyncConfigFieldCodec() {
super(BooleanConfigFieldCodec.INSTANCE);
}
}
// TODO: Other async types as needed
class ConfigStateField<T> { class ConfigStateField<T> {
private static final Map<Class<?>, ConfigFieldCodec<?>> CODECS_BY_TYPE = new HashMap<>(); private static final Map<Class<?>, ConfigFieldCodec<?>> CODECS_BY_TYPE = new HashMap<>();
private static final Map<Class<?>, ConfigFieldCodec<?>> CODECS_BY_SPEC = new HashMap<>(); private static final Map<Class<?>, ConfigFieldCodec<?>> CODECS_BY_SPEC = new HashMap<>();

View file

@ -28,7 +28,6 @@ dependencies {
// Oof. Apparently, this doesn't work transitively.... // Oof. Apparently, this doesn't work transitively....
testImplementation project(path: ':Generic', configuration: 'testArtifacts') testImplementation project(path: ':Generic', configuration: 'testArtifacts')
testImplementation project(path: ':ProposedUtils', configuration: 'testArtifacts') testImplementation project(path: ':ProposedUtils', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts') testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger', configuration: 'testArtifacts') testImplementation project(path: ':Debugger', configuration: 'testArtifacts')
testImplementation project(path: ':SystemEmulation', configuration: 'testArtifacts') testImplementation project(path: ':SystemEmulation', configuration: 'testArtifacts')

View file

@ -26,13 +26,15 @@ import java.util.stream.Collectors;
/** /**
* A fence that completes when all participating futures complete * A fence that completes when all participating futures complete
* *
* <p>
* This provides an alternative shorthand for Java's * This provides an alternative shorthand for Java's
* {@link CompletableFuture#thenAcceptBoth(CompletionStage, BiConsumer)} or * {@link CompletableFuture#thenAcceptBoth(CompletionStage, BiConsumer)} or
* {@link CompletableFuture#allOf(CompletableFuture...)}. * {@link CompletableFuture#allOf(CompletableFuture...)}.
* *
* <p>
* Example: * Example:
* *
* <pre> * <pre>{@code
* public CompletableFuture<Void> processAll(List<Integer> list) { * public CompletableFuture<Void> processAll(List<Integer> list) {
* AsyncFence fence = new AsyncFence(); * AsyncFence fence = new AsyncFence();
* for (int entry : list) { * for (int entry : list) {
@ -40,7 +42,7 @@ import java.util.stream.Collectors;
* } * }
* return fence.ready(); * return fence.ready();
* } * }
* </pre> * }</pre>
*/ */
public class AsyncFence { public class AsyncFence {
private final ArrayList<CompletableFuture<?>> participants = new ArrayList<>(); private final ArrayList<CompletableFuture<?>> participants = new ArrayList<>();

View file

@ -67,7 +67,6 @@ dependencies {
testImplementation project(path: ':ProposedUtils', configuration: 'testArtifacts') testImplementation project(path: ':ProposedUtils', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts') testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger', configuration: 'testArtifacts') testImplementation project(path: ':Debugger', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger-rmi-trace', configuration: 'testArtifacts') testImplementation project(path: ':Debugger-rmi-trace', configuration: 'testArtifacts')
} }

View file

@ -65,7 +65,6 @@ dependencies {
testImplementation project(path: ':GnuDemangler', configuration: 'testArtifacts') testImplementation project(path: ':GnuDemangler', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts') testImplementation project(path: ':Framework-TraceModeling', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger', configuration: 'testArtifacts') testImplementation project(path: ':Debugger', configuration: 'testArtifacts')
} }