Skip to content

Commit

Permalink
Merge pull request #785 from refinedmods/feat/GH-612/autocrafter-locking
Browse files Browse the repository at this point in the history
Autocrafter locking
  • Loading branch information
raoulvdberge authored Jan 27, 2025
2 parents 1b11c24 + fcfa74d commit 7856310
Show file tree
Hide file tree
Showing 39 changed files with 549 additions and 144 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ protected AbstractTaskPattern(final Pattern pattern, final TaskPlan.PatternPlan

abstract PatternStepResult step(MutableResourceList internalStorage,
RootStorage rootStorage,
ExternalPatternSinkProvider sinkProvider);
ExternalPatternSinkProvider sinkProvider,
TaskListener listener);

abstract RootStorageListener.InterceptResult interceptInsertion(ResourceKey resource, long amount);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class ExternalTaskPattern extends AbstractTaskPattern {
private long iterationsToSendToSink;
private long iterationsReceived;
private boolean interceptedAnythingSinceLastStep;
private boolean interceptedAnIterationAtLeastOnceSinceLastStep;
@Nullable
private ExternalPatternSink.Result lastSinkResult;
@Nullable
Expand Down Expand Up @@ -64,7 +65,12 @@ class ExternalTaskPattern extends AbstractTaskPattern {
@Override
PatternStepResult step(final MutableResourceList internalStorage,
final RootStorage rootStorage,
final ExternalPatternSinkProvider sinkProvider) {
final ExternalPatternSinkProvider sinkProvider,
final TaskListener listener) {
if (interceptedAnIterationAtLeastOnceSinceLastStep) {
interceptedAnIterationAtLeastOnceSinceLastStep = false;
listener.receivedExternalIteration(pattern);
}
if (expectedOutputs.isEmpty()) {
return PatternStepResult.COMPLETED;
}
Expand Down Expand Up @@ -96,12 +102,17 @@ RootStorageListener.InterceptResult interceptInsertion(final ResourceKey resourc
}
final long reserved = Math.min(needed, amount);
expectedOutputs.remove(resource, reserved);
updateIterationsReceived();
final boolean receivedAtLeastOneIteration = updateIterationsReceived();
if (receivedAtLeastOneIteration) {
interceptedAnIterationAtLeastOnceSinceLastStep = true;
}
this.interceptedAnythingSinceLastStep = true;
final long intercepted = root ? 0 : reserved;
return new RootStorageListener.InterceptResult(reserved, intercepted);
}

private void updateIterationsReceived() {
private boolean updateIterationsReceived() {
final long originalIterationsReceived = iterationsReceived;
long result = originalIterationsToSendToSink;
for (final ResourceAmount output : pattern.layout().outputs()) {
final long expected = output.amount() * originalIterationsToSendToSink;
Expand All @@ -113,7 +124,7 @@ private void updateIterationsReceived() {
}
}
this.iterationsReceived = result;
this.interceptedAnythingSinceLastStep = true;
return iterationsReceived > originalIterationsReceived;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ class InternalTaskPattern extends AbstractTaskPattern {
@Override
PatternStepResult step(final MutableResourceList internalStorage,
final RootStorage rootStorage,
final ExternalPatternSinkProvider sinkProvider) {
final ExternalPatternSinkProvider sinkProvider,
final TaskListener listener) {
final ResourceList iterationInputsSimulated = calculateIterationInputs(Action.SIMULATE);
if (!extractAll(iterationInputsSimulated, internalStorage, Action.SIMULATE)) {
return PatternStepResult.IDLE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ public interface Task extends RootStorageListener {

TaskState getState();

boolean step(RootStorage rootStorage, ExternalPatternSinkProvider sinkProvider, StepBehavior stepBehavior);
boolean step(RootStorage rootStorage,
ExternalPatternSinkProvider sinkProvider,
StepBehavior stepBehavior,
TaskListener listener);

void cancel();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,12 @@ private void updateState(final TaskState newState) {
@Override
public boolean step(final RootStorage rootStorage,
final ExternalPatternSinkProvider sinkProvider,
final StepBehavior stepBehavior) {
final StepBehavior stepBehavior,
final TaskListener listener) {
return switch (state) {
case READY -> startTask(rootStorage);
case EXTRACTING_INITIAL_RESOURCES -> extractInitialResourcesAndTryStartRunningTask(rootStorage);
case RUNNING -> stepPatterns(rootStorage, sinkProvider, stepBehavior);
case RUNNING -> stepPatterns(rootStorage, sinkProvider, stepBehavior, listener);
case RETURNING_INTERNAL_STORAGE -> returnInternalStorageAndTryCompleteTask(rootStorage);
case COMPLETED -> false;
};
Expand Down Expand Up @@ -219,12 +220,13 @@ private boolean extractInitialResourcesAndTryStartRunningTask(final RootStorage

private boolean stepPatterns(final RootStorage rootStorage,
final ExternalPatternSinkProvider sinkProvider,
final StepBehavior stepBehavior) {
final StepBehavior stepBehavior,
final TaskListener listener) {
final var it = patterns.entrySet().iterator();
boolean changed = false;
while (it.hasNext()) {
final var pattern = it.next();
final PatternStepResult result = stepPattern(rootStorage, sinkProvider, stepBehavior, pattern);
final PatternStepResult result = stepPattern(rootStorage, sinkProvider, stepBehavior, listener, pattern);
if (result == PatternStepResult.COMPLETED) {
it.remove();
}
Expand All @@ -243,6 +245,7 @@ private boolean stepPatterns(final RootStorage rootStorage,
private PatternStepResult stepPattern(final RootStorage rootStorage,
final ExternalPatternSinkProvider sinkProvider,
final StepBehavior stepBehavior,
final TaskListener listener,
final Map.Entry<Pattern, AbstractTaskPattern> pattern) {
PatternStepResult result = PatternStepResult.IDLE;
if (!stepBehavior.canStep(pattern.getKey())) {
Expand All @@ -253,7 +256,8 @@ private PatternStepResult stepPattern(final RootStorage rootStorage,
final PatternStepResult stepResult = pattern.getValue().step(
internalStorage,
rootStorage,
sinkProvider
sinkProvider,
listener
);
if (stepResult == PatternStepResult.COMPLETED) {
LOGGER.debug("{} completed", pattern.getKey());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.refinedmods.refinedstorage.api.autocrafting.task;

import com.refinedmods.refinedstorage.api.autocrafting.Pattern;

import org.apiguardian.api.API;

@API(status = API.Status.STABLE, since = "2.0.0-milestone.4.12")
public interface TaskListener {
TaskListener EMPTY = pattern -> {
};

void receivedExternalIteration(Pattern pattern);
}
Loading

0 comments on commit 7856310

Please sign in to comment.