Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

09971 simple timer api #9972

Merged
merged 6 commits into from
Nov 21, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,11 @@
import com.swirlds.base.time.Time;
import com.swirlds.common.context.PlatformContext;
import com.swirlds.common.metrics.Metrics;
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.wires.output.OutputWire;
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 edu.umd.cs.findbugs.annotations.NonNull;
import java.time.Duration;
import java.time.Instant;
import java.util.Set;

/**
Expand Down Expand Up @@ -82,31 +79,6 @@ static WiringModel create(@NonNull final Metrics metrics, @NonNull final Time ti
@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<Instant> 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<Instant> 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -45,21 +45,21 @@ private DirectSchedulerChecks() {}
*
* <ul>
* <li>
* Calling into a component with type {@link com.swirlds.common.wiring.builders.TaskSchedulerType#DIRECT DIRECT}
* from a component with {@link com.swirlds.common.wiring.builders.TaskSchedulerType#CONCURRENT CONCURRENT} is not
* Calling into a component with type {@link TaskSchedulerType#DIRECT DIRECT}
* from a component with {@link TaskSchedulerType#CONCURRENT CONCURRENT} is not
* allowed.
* </li>
* <li>
* Calling into a component with type {@link com.swirlds.common.wiring.builders.TaskSchedulerType#DIRECT DIRECT}
* Calling into a component with type {@link TaskSchedulerType#DIRECT DIRECT}
* from more than one component with type
* {@link com.swirlds.common.wiring.builders.TaskSchedulerType#SEQUENTIAL SEQUENTIAL} or type
* {@link com.swirlds.common.wiring.builders.TaskSchedulerType#SEQUENTIAL_THREAD SEQUENTIAL_THREAD} is not allowed.
* {@link TaskSchedulerType#SEQUENTIAL SEQUENTIAL} or type
* {@link TaskSchedulerType#SEQUENTIAL_THREAD SEQUENTIAL_THREAD} is not allowed.
* </li>
* <li>
* Calling into a component A with type
* {@link com.swirlds.common.wiring.builders.TaskSchedulerType#DIRECT DIRECT} from component B with type
* {@link com.swirlds.common.wiring.builders.TaskSchedulerType#DIRECT DIRECT} or type
* {@link com.swirlds.common.wiring.builders.TaskSchedulerType#DIRECT_STATELESS DIRECT_STATELESS} counts as a call
* {@link TaskSchedulerType#DIRECT DIRECT} from component B with type
* {@link TaskSchedulerType#DIRECT DIRECT} or type
* {@link TaskSchedulerType#DIRECT_STATELESS DIRECT_STATELESS} counts as a call
* into B from all components calling into component A.
* </li>
* </ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@

import com.swirlds.base.time.Time;
import com.swirlds.common.metrics.Metrics;
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;
Expand Down Expand Up @@ -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
cody-littley marked this conversation as resolved.
Show resolved Hide resolved
*/
@NonNull
@Override
public OutputWire<Instant> 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<Instant> buildHeartbeatWire(final double frequency) {
return getHeartbeatScheduler().buildHeartbeatWire(frequency);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,22 @@
* 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.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;

Expand Down Expand Up @@ -122,6 +125,44 @@ public <T> StandardOutputWire<T> 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<Instant, OUT> buildHeartbeatInputWire(@NonNull final String name, @NonNull final Duration period) {
final BindableInputWire<Instant, OUT> 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<Instant, OUT> buildHeartbeatInputWire(@NonNull final String name, final double frequency) {
final BindableInputWire<Instant, OUT> inputWire = buildInputWire(name);
model.buildHeartbeatWire(frequency).solderTo(inputWire);
return inputWire;
}

/**
* Get the name of this task scheduler.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@
* 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;
import com.swirlds.common.metrics.Metrics;
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down