From 175919d21ecf64d9ea69a172085c670d25fdd208 Mon Sep 17 00:00:00 2001 From: Cody Littley Date: Fri, 17 Nov 2023 14:16:28 -0600 Subject: [PATCH 1/4] Create bindable interface. Signed-off-by: Cody Littley --- .../common/wiring/model/WiringModel.java | 6 +- .../model/internal/DirectSchedulerChecks.java | 18 ++-- .../wiring/model/internal/ModelVertex.java | 2 +- .../model/internal/StandardWiringModel.java | 12 +-- .../model/internal/WiringFlowchart.java | 2 +- .../{ => schedulers}/TaskScheduler.java | 8 +- .../builders/TaskSchedulerBuilder.java | 12 +-- .../builders/TaskSchedulerMetricsBuilder.java | 4 +- .../builders/TaskSchedulerType.java | 2 +- .../{ => internal}/AbstractTask.java | 2 +- .../{ => internal}/ConcurrentTask.java | 2 +- .../ConcurrentTaskScheduler.java | 6 +- .../{ => internal}/DirectTaskScheduler.java | 6 +- .../{ => internal}/HeartbeatScheduler.java | 4 +- .../{ => internal}/HeartbeatTask.java | 2 +- .../{ => internal}/SequentialTask.java | 2 +- .../SequentialTaskScheduler.java | 6 +- .../{ => internal}/SequentialThreadTask.java | 2 +- .../SequentialThreadTaskScheduler.java | 6 +- .../internal/AdvancedWireTransformer.java | 2 +- .../transformers/internal/WireFilter.java | 2 +- .../internal/WireListSplitter.java | 2 +- .../internal/WireTransformer.java | 2 +- .../common/wiring/wires/input/Bindable.java | 48 +++++++++ .../wiring/wires/input/BindableInputWire.java | 59 ++--------- .../common/wiring/wires/input/InputWire.java | 2 +- .../wires/input/TaskSchedulerInput.java | 2 +- .../src/main/java/module-info.java | 4 +- .../wiring/benchmark/WiringBenchmark.java | 4 +- .../common/wiring/model/ModelTests.java | 4 +- .../ConcurrentTaskSchedulerTests.java | 15 +-- .../schedulers/DirectTaskSchedulerTests.java | 3 +- .../SequentialTaskSchedulerTests.java | 99 +++++++------------ .../TaskSchedulerTransformersTests.java | 2 +- .../wiring/EventDeduplicatorScheduler.java | 4 +- .../EventSignatureValidatorScheduler.java | 4 +- .../wiring/InOrderLinkerScheduler.java | 4 +- .../InternalEventValidatorScheduler.java | 4 +- .../wiring/LinkedEventIntakeScheduler.java | 4 +- .../wiring/OrphanBufferScheduler.java | 4 +- 40 files changed, 170 insertions(+), 208 deletions(-) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/{ => schedulers}/TaskScheduler.java (96%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/{ => schedulers}/builders/TaskSchedulerBuilder.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/{ => schedulers}/builders/TaskSchedulerMetricsBuilder.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/{ => schedulers}/builders/TaskSchedulerType.java (98%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/AbstractTask.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/ConcurrentTask.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/ConcurrentTaskScheduler.java (95%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/DirectTaskScheduler.java (96%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/HeartbeatScheduler.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/HeartbeatTask.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/SequentialTask.java (98%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/SequentialTaskScheduler.java (97%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/SequentialThreadTask.java (95%) rename platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/{ => internal}/SequentialThreadTaskScheduler.java (97%) create mode 100644 platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/Bindable.java diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java index b9af40df0ca2..81bfd68976ac 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java @@ -20,10 +20,10 @@ import com.swirlds.base.state.Stoppable; import com.swirlds.base.time.Time; import com.swirlds.common.context.PlatformContext; -import com.swirlds.common.wiring.builders.TaskSchedulerBuilder; -import com.swirlds.common.wiring.builders.TaskSchedulerMetricsBuilder; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerBuilder; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerMetricsBuilder; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.output.OutputWire; import edu.umd.cs.findbugs.annotations.NonNull; import java.time.Duration; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/DirectSchedulerChecks.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/DirectSchedulerChecks.java index a7e5af2cf991..da25ef2d208c 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/DirectSchedulerChecks.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/DirectSchedulerChecks.java @@ -19,7 +19,7 @@ import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import static com.swirlds.logging.legacy.LogMarker.STARTUP; -import com.swirlds.common.wiring.builders.TaskSchedulerType; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Collection; import java.util.Deque; @@ -45,21 +45,21 @@ private DirectSchedulerChecks() {} * * diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/ModelVertex.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/ModelVertex.java index b5beb4680612..c34c49100143 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/ModelVertex.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/ModelVertex.java @@ -16,7 +16,7 @@ package com.swirlds.common.wiring.model.internal; -import com.swirlds.common.wiring.builders.TaskSchedulerType; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.util.ArrayList; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java index e8d27a37aa4a..45b6182f0ae6 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java @@ -18,14 +18,14 @@ import com.swirlds.base.time.Time; import com.swirlds.common.context.PlatformContext; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerBuilder; -import com.swirlds.common.wiring.builders.TaskSchedulerMetricsBuilder; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.ModelGroup; import com.swirlds.common.wiring.model.WiringModel; -import com.swirlds.common.wiring.schedulers.HeartbeatScheduler; -import com.swirlds.common.wiring.schedulers.SequentialThreadTaskScheduler; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerBuilder; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerMetricsBuilder; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; +import com.swirlds.common.wiring.schedulers.internal.HeartbeatScheduler; +import com.swirlds.common.wiring.schedulers.internal.SequentialThreadTaskScheduler; import com.swirlds.common.wiring.wires.SolderType; import com.swirlds.common.wiring.wires.output.OutputWire; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/WiringFlowchart.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/WiringFlowchart.java index 40db27146145..23e18e2944d9 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/WiringFlowchart.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/WiringFlowchart.java @@ -16,8 +16,8 @@ package com.swirlds.common.wiring.model.internal; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.ModelGroup; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.ArrayList; import java.util.HashMap; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/TaskScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java similarity index 96% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/TaskScheduler.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java index 27c5770ee2f6..9e817cac2300 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/TaskScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.swirlds.common.wiring; +package com.swirlds.common.wiring.schedulers; -import com.swirlds.common.wiring.builders.TaskSchedulerBuilder; -import com.swirlds.common.wiring.builders.TaskSchedulerMetricsBuilder; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerBuilder; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerMetricsBuilder; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.input.TaskSchedulerInput; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerBuilder.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerBuilder.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerBuilder.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerBuilder.java index e51517c5d6bc..0067c55a6488 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerBuilder.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerBuilder.java @@ -14,23 +14,23 @@ * limitations under the License. */ -package com.swirlds.common.wiring.builders; +package com.swirlds.common.wiring.schedulers.builders; import static com.swirlds.logging.legacy.LogMarker.EXCEPTION; import com.swirlds.common.metrics.extensions.FractionalTimer; import com.swirlds.common.metrics.extensions.NoOpFractionalTimer; -import com.swirlds.common.wiring.TaskScheduler; import com.swirlds.common.wiring.counters.BackpressureObjectCounter; import com.swirlds.common.wiring.counters.MultiObjectCounter; import com.swirlds.common.wiring.counters.NoOpObjectCounter; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.counters.StandardObjectCounter; import com.swirlds.common.wiring.model.internal.StandardWiringModel; -import com.swirlds.common.wiring.schedulers.ConcurrentTaskScheduler; -import com.swirlds.common.wiring.schedulers.DirectTaskScheduler; -import com.swirlds.common.wiring.schedulers.SequentialTaskScheduler; -import com.swirlds.common.wiring.schedulers.SequentialThreadTaskScheduler; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.internal.ConcurrentTaskScheduler; +import com.swirlds.common.wiring.schedulers.internal.DirectTaskScheduler; +import com.swirlds.common.wiring.schedulers.internal.SequentialTaskScheduler; +import com.swirlds.common.wiring.schedulers.internal.SequentialThreadTaskScheduler; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.lang.Thread.UncaughtExceptionHandler; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerMetricsBuilder.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerMetricsBuilder.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerMetricsBuilder.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerMetricsBuilder.java index a41c522e5f5a..f7e243210476 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerMetricsBuilder.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerMetricsBuilder.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.builders; +package com.swirlds.common.wiring.schedulers.builders; import com.swirlds.base.time.Time; import com.swirlds.common.metrics.FunctionGauge; @@ -22,8 +22,8 @@ import com.swirlds.common.metrics.extensions.FractionalTimer; import com.swirlds.common.metrics.extensions.NoOpFractionalTimer; import com.swirlds.common.metrics.extensions.StandardFractionalTimer; -import com.swirlds.common.wiring.TaskScheduler; import com.swirlds.common.wiring.counters.ObjectCounter; +import com.swirlds.common.wiring.schedulers.TaskScheduler; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.util.Objects; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerType.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerType.java similarity index 98% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerType.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerType.java index ce24525cf8f2..c225319a604b 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/builders/TaskSchedulerType.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/builders/TaskSchedulerType.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.builders; +package com.swirlds.common.wiring.schedulers.builders; /** * Various types of task schedulers. Pass one of these types to {@link TaskSchedulerBuilder#withType(TaskSchedulerType)} diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/AbstractTask.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/AbstractTask.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/AbstractTask.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/AbstractTask.java index 33d49fe4c373..9794d9813234 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/AbstractTask.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/AbstractTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.concurrent.ForkJoinPool; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/ConcurrentTask.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/ConcurrentTask.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/ConcurrentTask.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/ConcurrentTask.java index cf256cd84726..c4cb03c57418 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/ConcurrentTask.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/ConcurrentTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import com.swirlds.common.wiring.counters.ObjectCounter; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/ConcurrentTaskScheduler.java similarity index 95% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskScheduler.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/ConcurrentTaskScheduler.java index ab65c4cf371c..568ba3126b3a 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/ConcurrentTaskScheduler.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import java.lang.Thread.UncaughtExceptionHandler; import java.util.Objects; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/DirectTaskScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/DirectTaskScheduler.java similarity index 96% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/DirectTaskScheduler.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/DirectTaskScheduler.java index 30855823ec09..71f3e35c3f1d 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/DirectTaskScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/DirectTaskScheduler.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import com.swirlds.common.metrics.extensions.FractionalTimer; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import java.lang.Thread.UncaughtExceptionHandler; import java.util.Objects; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/HeartbeatScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/HeartbeatScheduler.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java index 60c2b05f828a..28bfdc5b3eb6 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/HeartbeatScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import com.swirlds.base.state.Startable; import com.swirlds.base.state.Stoppable; import com.swirlds.base.time.Time; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.output.OutputWire; import edu.umd.cs.findbugs.annotations.NonNull; import java.time.Duration; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/HeartbeatTask.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatTask.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/HeartbeatTask.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatTask.java index 6b2539acdf63..90969ea97116 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/HeartbeatTask.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import com.swirlds.base.time.Time; import com.swirlds.common.wiring.model.internal.StandardWiringModel; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialTask.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialTask.java similarity index 98% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialTask.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialTask.java index fa142c4bbcbb..a7a8d0329557 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialTask.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import com.swirlds.common.metrics.extensions.FractionalTimer; import com.swirlds.common.wiring.counters.ObjectCounter; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialTaskScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialTaskScheduler.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialTaskScheduler.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialTaskScheduler.java index aa67b8f8226e..67e2215abe75 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialTaskScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialTaskScheduler.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import com.swirlds.common.metrics.extensions.FractionalTimer; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import java.lang.Thread.UncaughtExceptionHandler; import java.util.Objects; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialThreadTask.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialThreadTask.java similarity index 95% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialThreadTask.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialThreadTask.java index b62e53d33dda..7547b44d1256 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialThreadTask.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialThreadTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.function.Consumer; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialThreadTaskScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialThreadTaskScheduler.java similarity index 97% rename from platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialThreadTaskScheduler.java rename to platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialThreadTaskScheduler.java index ead4ef979a5f..20a0e58821c8 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/SequentialThreadTaskScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/SequentialThreadTaskScheduler.java @@ -14,17 +14,17 @@ * limitations under the License. */ -package com.swirlds.common.wiring.schedulers; +package com.swirlds.common.wiring.schedulers.internal; import static java.util.concurrent.TimeUnit.NANOSECONDS; import com.swirlds.base.state.Startable; import com.swirlds.base.state.Stoppable; import com.swirlds.common.metrics.extensions.FractionalTimer; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import edu.umd.cs.findbugs.annotations.NonNull; import java.lang.Thread.UncaughtExceptionHandler; import java.time.Duration; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/AdvancedWireTransformer.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/AdvancedWireTransformer.java index 9fdd13c185dc..c84c8346246b 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/AdvancedWireTransformer.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/AdvancedWireTransformer.java @@ -16,8 +16,8 @@ package com.swirlds.common.wiring.transformers.internal; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.common.wiring.wires.output.internal.ForwardingOutputWire; import com.swirlds.common.wiring.wires.output.internal.TransformingOutputWire; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireFilter.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireFilter.java index 3e2d95f6a906..777c9e5544e6 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireFilter.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireFilter.java @@ -16,8 +16,8 @@ package com.swirlds.common.wiring.transformers.internal; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.common.wiring.wires.output.StandardOutputWire; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireListSplitter.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireListSplitter.java index fdcd39274f44..aae32b030ea3 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireListSplitter.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireListSplitter.java @@ -16,8 +16,8 @@ package com.swirlds.common.wiring.transformers.internal; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.common.wiring.wires.output.StandardOutputWire; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireTransformer.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireTransformer.java index e87e25592909..c8cd19b732bc 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireTransformer.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/transformers/internal/WireTransformer.java @@ -16,8 +16,8 @@ package com.swirlds.common.wiring.transformers.internal; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.common.wiring.wires.output.StandardOutputWire; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/Bindable.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/Bindable.java new file mode 100644 index 000000000000..4505bafd53cc --- /dev/null +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/Bindable.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * 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 com.swirlds.common.wiring.wires.input; + +import edu.umd.cs.findbugs.annotations.NonNull; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * An object that can be bound to a handler. + * + * @param the type of data that enters + * @param the type of data that is permitted to be passed out (non-null values are forwarded to the primary output + * wire) + */ +public interface Bindable { + + /** + * Bind this object to a handler. + * + * @param handler the handler to bind to this input wire + * @throws IllegalStateException if a handler is already bound and this method is called a second time + */ + void bind(@NonNull Consumer handler); + + /** + * Bind this object to a handler. + * + * @param handler the handler to bind to this input task scheduler, values returned are passed to the primary output + * wire of the associated scheduler. + * @throws IllegalStateException if a handler is already bound and this method is called a second time + */ + void bind(@NonNull final Function handler); +} diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/BindableInputWire.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/BindableInputWire.java index c645c55d2654..57bd7820d040 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/BindableInputWire.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/BindableInputWire.java @@ -16,8 +16,8 @@ package com.swirlds.common.wiring.wires.input; -import com.swirlds.common.wiring.TaskScheduler; import com.swirlds.common.wiring.model.internal.StandardWiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Objects; import java.util.function.Consumer; @@ -29,7 +29,7 @@ * @param the type of data that passes into the wire * @param the type of the primary output wire for the scheduler that is associated with this object */ -public class BindableInputWire extends InputWire { +public class BindableInputWire extends InputWire implements Bindable { private final TaskSchedulerInput taskSchedulerInput; private final String taskSchedulerName; @@ -55,65 +55,20 @@ public BindableInputWire( } /** - * Cast this input wire into whatever a variable is expecting. Sometimes the compiler gets confused with generics, - * and path of least resistance is to just cast to the proper data type. - * - *

- * Warning: this will appease the compiler, but it is possible to cast a wire into a data type that will cause - * runtime exceptions. Use with appropriate caution. - * - * @param the input type to cast to - * @param the output type to cast to - * @return this, cast into whatever type is requested + * {@inheritDoc} */ - @NonNull @SuppressWarnings("unchecked") - public final BindableInputWire cast() { - return (BindableInputWire) this; - } - - /** - * Convenience method for creating an input wire with a specific input type. This method is useful for when the - * compiler can't figure out the generic type of the input wire. This method is a no op. - * - * @param inputType the input type of the input wire - * @param the input type of the input wire - * @return this - */ - @SuppressWarnings("unchecked") - public BindableInputWire withInputType(@NonNull final Class inputType) { - return (BindableInputWire) this; - } - - /** - * Bind this input wire to a handler. A handler must be bound to this input wire prior to inserting data via any - * method. - * - * @param handler the handler to bind to this input wire - * @return this - * @throws IllegalStateException if a handler is already bound and this method is called a second time - */ - @SuppressWarnings("unchecked") - @NonNull - public BindableInputWire bind(@NonNull final Consumer handler) { + public void bind(@NonNull final Consumer handler) { Objects.requireNonNull(handler); setHandler((Consumer) handler); model.registerInputWireBinding(taskSchedulerName, getName()); - - return this; } /** - * Bind this input wire to a handler. A handler must be bound to this inserter prior to inserting data via any - * method. - * - * @param handler the handler to bind to this input task scheduler - * @return this - * @throws IllegalStateException if a handler is already bound and this method is called a second time + * {@inheritDoc} */ @SuppressWarnings("unchecked") - @NonNull - public BindableInputWire bind(@NonNull final Function handler) { + public void bind(@NonNull final Function handler) { Objects.requireNonNull(handler); setHandler(i -> { final OUT output = handler.apply((IN) i); @@ -121,7 +76,5 @@ public BindableInputWire bind(@NonNull final Function handler) taskSchedulerInput.forward(output); } }); - - return this; } } diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/InputWire.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/InputWire.java index 3f3ca884a206..88591ba77091 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/InputWire.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/InputWire.java @@ -16,7 +16,7 @@ package com.swirlds.common.wiring.wires.input; -import com.swirlds.common.wiring.TaskScheduler; +import com.swirlds.common.wiring.schedulers.TaskScheduler; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Objects; import java.util.function.Consumer; diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/TaskSchedulerInput.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/TaskSchedulerInput.java index 6e967df899d4..0012ab601ba6 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/TaskSchedulerInput.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/wires/input/TaskSchedulerInput.java @@ -16,7 +16,7 @@ package com.swirlds.common.wiring.wires.input; -import com.swirlds.common.wiring.TaskScheduler; +import com.swirlds.common.wiring.schedulers.TaskScheduler; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.function.Consumer; diff --git a/platform-sdk/swirlds-common/src/main/java/module-info.java b/platform-sdk/swirlds-common/src/main/java/module-info.java index ee92cda0da25..1a24a3b1e7f3 100644 --- a/platform-sdk/swirlds-common/src/main/java/module-info.java +++ b/platform-sdk/swirlds-common/src/main/java/module-info.java @@ -76,10 +76,10 @@ exports com.swirlds.common.utility.throttle; exports com.swirlds.common.jackson; exports com.swirlds.common.units; - exports com.swirlds.common.wiring; - exports com.swirlds.common.wiring.builders; exports com.swirlds.common.wiring.counters; exports com.swirlds.common.wiring.model; + exports com.swirlds.common.wiring.schedulers; + exports com.swirlds.common.wiring.schedulers.builders; exports com.swirlds.common.wiring.transformers; exports com.swirlds.common.wiring.wires; exports com.swirlds.common.wiring.wires.input; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/benchmark/WiringBenchmark.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/benchmark/WiringBenchmark.java index 67e5ecb7750e..cdae2244c43b 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/benchmark/WiringBenchmark.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/benchmark/WiringBenchmark.java @@ -22,11 +22,11 @@ import com.swirlds.base.time.Time; import com.swirlds.common.context.PlatformContext; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.BackpressureObjectCounter; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.test.framework.context.TestPlatformContextBuilder; import java.time.Duration; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java index 0665a5cd3d7c..a52736ea1954 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java @@ -21,8 +21,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.swirlds.base.time.Time; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.SolderType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskSchedulerTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskSchedulerTests.java index fe03c9bbadb1..a3cf7eb9f7e0 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskSchedulerTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/ConcurrentTaskSchedulerTests.java @@ -22,9 +22,8 @@ import static java.util.concurrent.TimeUnit.MICROSECONDS; import static org.junit.jupiter.api.Assertions.assertEquals; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.test.framework.TestWiringModelBuilder; import edu.umd.cs.findbugs.annotations.Nullable; @@ -61,10 +60,8 @@ void allOperationsHandledTest() { .withType(TaskSchedulerType.CONCURRENT) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); @@ -112,10 +109,8 @@ record Operation(int value, @Nullable CountDownLatch latch, @Nullable AtomicBool .withType(TaskSchedulerType.CONCURRENT) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Operation.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/DirectTaskSchedulerTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/DirectTaskSchedulerTests.java index 658228720091..a9caa6b17300 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/DirectTaskSchedulerTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/DirectTaskSchedulerTests.java @@ -20,10 +20,9 @@ import static com.swirlds.common.utility.NonCryptographicHashing.hash32; import static org.junit.jupiter.api.Assertions.assertEquals; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.StandardObjectCounter; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.SolderType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.output.OutputWire; diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/SequentialTaskSchedulerTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/SequentialTaskSchedulerTests.java index 5ea16587a2bd..9091bcb93fd1 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/SequentialTaskSchedulerTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/SequentialTaskSchedulerTests.java @@ -30,11 +30,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.swirlds.common.threading.framework.config.ThreadConfiguration; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.counters.BackpressureObjectCounter; import com.swirlds.common.wiring.counters.ObjectCounter; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.SolderType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.output.StandardOutputWire; @@ -94,10 +93,8 @@ void orderOfOperationsTest(final String typeString) { final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -143,10 +140,8 @@ void orderOfOperationsWithDelayTest(final String typeString) { final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -182,10 +177,8 @@ void multipleChannelsTest(final String typeString) { final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -252,10 +245,8 @@ void multipleChannelsWithDelayTest(final String typeString) { final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -330,10 +321,8 @@ void wireWordDoesNotBlockCallingThreadTest(final String typeString) throws Inter final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -394,10 +383,8 @@ void unprocessedEventCountTest(final String typeString) { .withMetricsBuilder(model.metricsBuilder().withUnhandledTaskMetricEnabled(true)) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(0, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -473,10 +460,8 @@ void backpressureTest(final String typeString) throws InterruptedException { .withSleepDuration(Duration.ofMillis(1)) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(0, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -570,10 +555,8 @@ void uninterruptableTest(final String typeString) throws InterruptedException { .withUnhandledTaskCapacity(11) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(0, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -644,10 +627,8 @@ void offerNoBackpressureTest(final String typeString) { final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -807,18 +788,12 @@ void multipleChannelTypesTest(final String typeString) { final TaskScheduler taskScheduler = model.schedulerBuilder("test").withType(type).build().cast(); - final BindableInputWire integerChannel = taskScheduler - .buildInputWire("integerChannel") - .withInputType(Integer.class) - .bind(integerHandler); - final BindableInputWire booleanChannel = taskScheduler - .buildInputWire("booleanChannel") - .withInputType(Boolean.class) - .bind(booleanHandler); - final BindableInputWire stringChannel = taskScheduler - .buildInputWire("stringChannel") - .withInputType(String.class) - .bind(stringHandler); + final BindableInputWire integerChannel = taskScheduler.buildInputWire("integerChannel"); + integerChannel.bind(integerHandler); + final BindableInputWire booleanChannel = taskScheduler.buildInputWire("booleanChannel"); + booleanChannel.bind(booleanHandler); + final BindableInputWire stringChannel = taskScheduler.buildInputWire("stringChannel"); + stringChannel.bind(stringHandler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -876,14 +851,10 @@ void multipleChannelBackpressureTest(final String typeString) throws Interrupted .build() .cast(); - final BindableInputWire channel1 = taskScheduler - .buildInputWire("channel1") - .withInputType(Integer.class) - .bind(handler1); - final BindableInputWire channel2 = taskScheduler - .buildInputWire("channel2") - .withInputType(Integer.class) - .bind(handler2); + final BindableInputWire channel1 = taskScheduler.buildInputWire("channel1"); + channel1.bind(handler1); + final BindableInputWire channel2 = taskScheduler.buildInputWire("channel2"); + channel2.bind(handler2); assertEquals(0, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -1100,10 +1071,8 @@ void flushTest(final String typeString) throws InterruptedException { .withFlushingEnabled(true) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(0, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); @@ -1224,10 +1193,8 @@ void exceptionHandlingTest(final String typeString) { .withUncaughtExceptionHandler((t, e) -> exceptionCount.incrementAndGet()) .build() .cast(); - final BindableInputWire channel = taskScheduler - .buildInputWire("channel") - .withInputType(Integer.class) - .bind(handler); + final BindableInputWire channel = taskScheduler.buildInputWire("channel"); + channel.bind(handler); assertEquals(-1, taskScheduler.getUnprocessedTaskCount()); assertEquals("test", taskScheduler.getName()); diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/transformers/TaskSchedulerTransformersTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/transformers/TaskSchedulerTransformersTests.java index 78363f262bfa..b718ac98c522 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/transformers/TaskSchedulerTransformersTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/transformers/TaskSchedulerTransformersTests.java @@ -22,8 +22,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.swirlds.common.wiring.TaskScheduler; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.test.framework.TestWiringModelBuilder; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventDeduplicatorScheduler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventDeduplicatorScheduler.java index bc63e953e8ad..fa7b19e70d7e 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventDeduplicatorScheduler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventDeduplicatorScheduler.java @@ -16,9 +16,9 @@ package com.swirlds.platform.wiring; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.output.OutputWire; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventSignatureValidatorScheduler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventSignatureValidatorScheduler.java index d63441336d8c..bcb5f8f136c1 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventSignatureValidatorScheduler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/EventSignatureValidatorScheduler.java @@ -16,9 +16,9 @@ package com.swirlds.platform.wiring; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.output.OutputWire; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InOrderLinkerScheduler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InOrderLinkerScheduler.java index febba9ade6c8..7efbc2318a73 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InOrderLinkerScheduler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InOrderLinkerScheduler.java @@ -16,9 +16,9 @@ package com.swirlds.platform.wiring; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.output.OutputWire; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InternalEventValidatorScheduler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InternalEventValidatorScheduler.java index fc5be681389c..e7349c33bfe0 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InternalEventValidatorScheduler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/InternalEventValidatorScheduler.java @@ -16,9 +16,9 @@ package com.swirlds.platform.wiring; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.output.OutputWire; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/LinkedEventIntakeScheduler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/LinkedEventIntakeScheduler.java index e65e6dad5ed0..4f64e72e91a1 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/LinkedEventIntakeScheduler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/LinkedEventIntakeScheduler.java @@ -16,9 +16,9 @@ package com.swirlds.platform.wiring; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.platform.components.LinkedEventIntake; diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/OrphanBufferScheduler.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/OrphanBufferScheduler.java index da81a1fba31c..c755228ad0a6 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/OrphanBufferScheduler.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/wiring/OrphanBufferScheduler.java @@ -16,9 +16,9 @@ package com.swirlds.platform.wiring; -import com.swirlds.common.wiring.TaskScheduler; -import com.swirlds.common.wiring.builders.TaskSchedulerType; import com.swirlds.common.wiring.model.WiringModel; +import com.swirlds.common.wiring.schedulers.TaskScheduler; +import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.output.OutputWire; From f946c8c999e65c5650861409b0596f5d68a7cf33 Mon Sep 17 00:00:00 2001 From: Cody Littley Date: Fri, 17 Nov 2023 14:43:28 -0600 Subject: [PATCH 2/4] Finished refactor. Signed-off-by: Cody Littley --- .../common/wiring/model/WiringModel.java | 28 ------------- .../model/internal/StandardWiringModel.java | 20 +++++++-- .../wiring/schedulers/TaskScheduler.java | 41 +++++++++++++++++++ .../common/wiring/model/ModelTests.java | 7 +--- .../schedulers/HeartbeatSchedulerTests.java | 31 +++++++++----- 5 files changed, 78 insertions(+), 49 deletions(-) diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java index 81bfd68976ac..5f04d77d2e8e 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/WiringModel.java @@ -24,10 +24,7 @@ import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerBuilder; import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerMetricsBuilder; import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; -import com.swirlds.common.wiring.wires.output.OutputWire; import edu.umd.cs.findbugs.annotations.NonNull; -import java.time.Duration; -import java.time.Instant; import java.util.Set; /** @@ -69,31 +66,6 @@ static WiringModel create(@NonNull final PlatformContext platformContext, @NonNu @NonNull TaskSchedulerMetricsBuilder metricsBuilder(); - /** - * Build a wire that produces an instant (reflecting current time) at the specified rate. Note that the exact rate - * of heartbeats may vary. This is a best effort algorithm, and actual rates may vary depending on a variety of - * factors. - * - * @param period the period of the heartbeat. For example, setting a period of 100ms will cause the heartbeat to be - * sent at 10 hertz. Note that time is measured at millisecond precision, and so periods less than 1ms - * are not supported. - * @return the output wire - * @throws IllegalStateException if the heartbeat has already started - */ - @NonNull - OutputWire buildHeartbeatWire(@NonNull final Duration period); - - /** - * Build a wire that produces an instant (reflecting current time) at the specified rate. Note that the exact rate - * of heartbeats may vary. This is a best effort algorithm, and actual rates may vary depending on a variety of - * factors. - * - * @param frequency the frequency of the heartbeat in hertz. Note that time is measured at millisecond precision, - * and so frequencies greater than 1000hz are not supported. - * @return the output wire - */ - OutputWire buildHeartbeatWire(final double frequency); - /** * Check to see if there is cyclic backpressure in the wiring model. Cyclical back pressure can lead to deadlocks, * and so it should be avoided at all costs. diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java index 45b6182f0ae6..308575a11a48 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java @@ -108,18 +108,30 @@ public final TaskSchedulerMetricsBuilder metricsBuilder() { } /** - * {@inheritDoc} + * Build a wire that produces an instant (reflecting current time) at the specified rate. Note that the exact rate + * of heartbeats may vary. This is a best effort algorithm, and actual rates may vary depending on a variety of + * factors. + * + * @param period the period of the heartbeat. For example, setting a period of 100ms will cause the heartbeat to be + * sent at 10 hertz. Note that time is measured at millisecond precision, and so periods less than 1ms + * are not supported. + * @return the output wire + * @throws IllegalStateException if the heartbeat has already started */ @NonNull - @Override public OutputWire buildHeartbeatWire(@NonNull final Duration period) { return getHeartbeatScheduler().buildHeartbeatWire(period); } /** - * {@inheritDoc} + * Build a wire that produces an instant (reflecting current time) at the specified rate. Note that the exact rate + * of heartbeats may vary. This is a best effort algorithm, and actual rates may vary depending on a variety of + * factors. + * + * @param frequency the frequency of the heartbeat in hertz. Note that time is measured at millisecond precision, + * and so frequencies greater than 1000hz are not supported. + * @return the output wire */ - @Override public OutputWire buildHeartbeatWire(final double frequency) { return getHeartbeatScheduler().buildHeartbeatWire(frequency); } diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java index 9e817cac2300..5d318f820740 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/TaskScheduler.java @@ -21,12 +21,15 @@ import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerBuilder; import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerMetricsBuilder; import com.swirlds.common.wiring.schedulers.builders.TaskSchedulerType; +import com.swirlds.common.wiring.wires.input.Bindable; import com.swirlds.common.wiring.wires.input.BindableInputWire; import com.swirlds.common.wiring.wires.input.InputWire; import com.swirlds.common.wiring.wires.input.TaskSchedulerInput; import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.common.wiring.wires.output.StandardOutputWire; import edu.umd.cs.findbugs.annotations.NonNull; +import java.time.Duration; +import java.time.Instant; import java.util.Objects; import java.util.function.Consumer; @@ -122,6 +125,44 @@ public StandardOutputWire buildSecondaryOutputWire() { return new StandardOutputWire<>(model, name); } + /** + * Build an input wire that produces an instant (reflecting current time) at the specified rate. Note that the exact + * rate of heartbeats may vary. This is a best effort algorithm, and actual rates may vary depending on a variety of + * factors. + * + * @param name the name of the input + * @param period the period of the heartbeat. For example, setting a period of 100ms will cause the heartbeat to be + * sent at 10 hertz. Note that time is measured at millisecond precision, and so periods less than 1ms + * are not supported. + * @return a bindable object that allows for the implementation of the heartbeat handler to be bound to the input + * wire that provides the heartbeats + * @throws IllegalStateException if the heartbeat has already started + */ + @NonNull + public Bindable buildHeartbeatInputWire(@NonNull final String name, @NonNull final Duration period) { + final BindableInputWire inputWire = buildInputWire(name); + model.buildHeartbeatWire(period).solderTo(inputWire); + return inputWire; + } + + /** + * Build a wire that produces an instant (reflecting current time) at the specified rate. Note that the exact rate + * of heartbeats may vary. This is a best effort algorithm, and actual rates may vary depending on a variety of + * factors. + * + * @param name the name of the input + * @param frequency the frequency of the heartbeat in hertz. Note that time is measured at millisecond precision, + * and so frequencies greater than 1000hz are not supported. + * @return a bindable object that allows for the implementation of the heartbeat handler to be bound to the input + * wire that provides the heartbeats + */ + @NonNull + public Bindable buildHeartbeatInputWire(@NonNull final String name, final double frequency) { + final BindableInputWire inputWire = buildInputWire(name); + model.buildHeartbeatWire(frequency).solderTo(inputWire); + return inputWire; + } + /** * Get the name of this task scheduler. * diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java index a52736ea1954..25de91882488 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/model/ModelTests.java @@ -29,7 +29,6 @@ import com.swirlds.common.wiring.wires.output.OutputWire; import com.swirlds.test.framework.context.TestPlatformContextBuilder; import edu.umd.cs.findbugs.annotations.NonNull; -import java.time.Instant; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -1292,7 +1291,7 @@ void heartbeatTest() { final TaskScheduler taskSchedulerB = model.schedulerBuilder("B").withUnhandledTaskCapacity(1).build().cast(); final InputWire inputB = taskSchedulerB.buildInputWire("inputB"); - final InputWire heartbeatInputB = taskSchedulerB.buildInputWire("heartbeatInputB"); + taskSchedulerB.buildHeartbeatInputWire("heartbeat", 100); final TaskScheduler taskSchedulerC = model.schedulerBuilder("C").withUnhandledTaskCapacity(1).build().cast(); @@ -1302,15 +1301,11 @@ void heartbeatTest() { model.schedulerBuilder("D").withUnhandledTaskCapacity(1).build().cast(); final InputWire inputD = taskSchedulerD.buildInputWire("inputD"); - final OutputWire heartbeatWire = model.buildHeartbeatWire(100); - taskSchedulerA.getOutputWire().solderTo(inputB); taskSchedulerB.getOutputWire().solderTo(inputC); taskSchedulerC.getOutputWire().solderTo(inputD); taskSchedulerD.getOutputWire().solderTo(inputA); - heartbeatWire.solderTo(heartbeatInputB); - validateModel(model, true, false); } diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java index 7a19c9e68464..db240708b4a3 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java @@ -23,7 +23,7 @@ import com.swirlds.base.test.fixtures.time.FakeTime; import com.swirlds.common.context.PlatformContext; import com.swirlds.common.wiring.model.WiringModel; -import com.swirlds.common.wiring.wires.output.OutputWire; +import com.swirlds.common.wiring.wires.input.Bindable; import com.swirlds.test.framework.context.TestPlatformContextBuilder; import java.time.Duration; import java.time.Instant; @@ -39,10 +39,12 @@ void heartbeatByFrequencyTest() throws InterruptedException { final FakeTime fakeTime = new FakeTime(); final WiringModel model = WiringModel.create(platformContext, fakeTime); - final OutputWire outputWire = model.buildHeartbeatWire(100); + final TaskScheduler scheduler = + model.schedulerBuilder("test").build().cast(); + final Bindable heartbeatBindable = scheduler.buildHeartbeatInputWire("heartbeat", 100); final AtomicLong counter = new AtomicLong(0); - outputWire.solderTo("counter", (time) -> { + heartbeatBindable.bind((time) -> { assertEquals(time, fakeTime.now()); counter.incrementAndGet(); }); @@ -64,10 +66,13 @@ void heartbeatByPeriodTest() throws InterruptedException { final FakeTime fakeTime = new FakeTime(); final WiringModel model = WiringModel.create(platformContext, fakeTime); - final OutputWire outputWire = model.buildHeartbeatWire(Duration.ofMillis(10)); + final TaskScheduler scheduler = + model.schedulerBuilder("test").build().cast(); + final Bindable heartbeatBindable = + scheduler.buildHeartbeatInputWire("heartbeat", Duration.ofMillis(100)); final AtomicLong counter = new AtomicLong(0); - outputWire.solderTo("counter", (time) -> { + heartbeatBindable.bind((time) -> { assertEquals(time, fakeTime.now()); counter.incrementAndGet(); }); @@ -89,24 +94,28 @@ void heartbeatsAtDifferentRates() throws InterruptedException { final FakeTime fakeTime = new FakeTime(); final WiringModel model = WiringModel.create(platformContext, fakeTime); - final OutputWire outputWireA = model.buildHeartbeatWire(100); - final OutputWire outputWireB = model.buildHeartbeatWire(Duration.ofMillis(5)); - final OutputWire outputWireC = model.buildHeartbeatWire(Duration.ofMillis(50)); + final TaskScheduler scheduler = + model.schedulerBuilder("test").build().cast(); + final Bindable heartbeatBindableA = scheduler.buildHeartbeatInputWire("heartbeatA", 100); + final Bindable heartbeatBindableB = + scheduler.buildHeartbeatInputWire("heartbeatB", Duration.ofMillis(5)); + final Bindable heartbeatBindableC = + scheduler.buildHeartbeatInputWire("heartbeatC", Duration.ofMillis(50)); final AtomicLong counterA = new AtomicLong(0); - outputWireA.solderTo("counterA", (time) -> { + heartbeatBindableA.bind((time) -> { assertEquals(time, fakeTime.now()); counterA.incrementAndGet(); }); final AtomicLong counterB = new AtomicLong(0); - outputWireB.solderTo("counterB", (time) -> { + heartbeatBindableB.bind((time) -> { assertEquals(time, fakeTime.now()); counterB.incrementAndGet(); }); final AtomicLong counterC = new AtomicLong(0); - outputWireC.solderTo("counterC", (time) -> { + heartbeatBindableC.bind((time) -> { assertEquals(time, fakeTime.now()); counterC.incrementAndGet(); }); From de36684024718ed06352b268611f05a7b9b58e14 Mon Sep 17 00:00:00 2001 From: Cody Littley Date: Mon, 20 Nov 2023 09:03:42 -0600 Subject: [PATCH 3/4] Fixed unit test. Signed-off-by: Cody Littley --- .../common/wiring/schedulers/HeartbeatSchedulerTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java index db240708b4a3..b0b533812ff9 100644 --- a/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java +++ b/platform-sdk/swirlds-common/src/test/java/com/swirlds/common/wiring/schedulers/HeartbeatSchedulerTests.java @@ -69,7 +69,7 @@ void heartbeatByPeriodTest() throws InterruptedException { final TaskScheduler scheduler = model.schedulerBuilder("test").build().cast(); final Bindable heartbeatBindable = - scheduler.buildHeartbeatInputWire("heartbeat", Duration.ofMillis(100)); + scheduler.buildHeartbeatInputWire("heartbeat", Duration.ofMillis(10)); final AtomicLong counter = new AtomicLong(0); heartbeatBindable.bind((time) -> { From 972a4aaaf919d9d504f7fff0598b17cc7e4b8404 Mon Sep 17 00:00:00 2001 From: Cody Littley Date: Mon, 20 Nov 2023 15:44:15 -0600 Subject: [PATCH 4/4] Made suggested change. Signed-off-by: Cody Littley --- .../common/wiring/model/internal/StandardWiringModel.java | 2 +- .../common/wiring/schedulers/internal/HeartbeatScheduler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java index 5ecca10461a6..7544afdb75d6 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/model/internal/StandardWiringModel.java @@ -116,7 +116,7 @@ public final TaskSchedulerMetricsBuilder metricsBuilder() { * sent at 10 hertz. Note that time is measured at millisecond precision, and so periods less than 1ms * are not supported. * @return the output wire - * @throws IllegalStateException if the heartbeat has already started + * @throws IllegalStateException if start() has already been called */ @NonNull public OutputWire buildHeartbeatWire(@NonNull final Duration period) { diff --git a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java index 28bfdc5b3eb6..a3fd3bb38675 100644 --- a/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java +++ b/platform-sdk/swirlds-common/src/main/java/com/swirlds/common/wiring/schedulers/internal/HeartbeatScheduler.java @@ -66,7 +66,7 @@ public HeartbeatScheduler( * sent at 10 hertz. Note that time is measured at millisecond precision, and so periods less than 1ms * are not supported. * @return the output wire - * @throws IllegalStateException if the heartbeat has already started + * @throws IllegalStateException if start has already been called */ @NonNull public OutputWire buildHeartbeatWire(@NonNull final Duration period) {