From cfd3920c8c9fd99023a96f68cc5ac39a6b2e3199 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:24:49 -0400 Subject: [PATCH] Add tickable object framework --- .../tickables/LoadableTickableObject.java | 47 +++++++++++++++++++ .../modernfix/tickables/TickableObject.java | 5 ++ .../tickables/TickableObjectManager.java | 18 +++++++ 3 files changed, 70 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java b/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java new file mode 100644 index 00000000..8cb32cd5 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java @@ -0,0 +1,47 @@ +package org.embeddedt.modernfix.tickables; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class LoadableTickableObject implements TickableObject { + private volatile int ticksInactive = 0; + private final int timeout; + private final Supplier loader; + private final Consumer finalizer; + private volatile T theObject = null; + + public LoadableTickableObject(int timeout, Supplier loader, Consumer finalizer) { + this(timeout, loader, finalizer, null); + } + + public LoadableTickableObject(int timeout, Supplier loader, Consumer finalizer, @Nullable T initialValue) { + this.timeout = timeout; + this.loader = loader; + this.finalizer = finalizer; + this.theObject = initialValue; + } + + public T get() { + synchronized (this) { + ticksInactive++; + T obj = theObject; + if(obj == null) { + obj = loader.get(); + theObject = obj; + } + return obj; + } + } + + public final void tick() { + synchronized (this) { + ticksInactive++; + if(ticksInactive >= this.timeout) { + finalizer.accept(theObject); + theObject = null; + } + } + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java new file mode 100644 index 00000000..cc31c47f --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java @@ -0,0 +1,5 @@ +package org.embeddedt.modernfix.tickables; + +public interface TickableObject { + void tick(); +} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java new file mode 100644 index 00000000..4ec5f8e8 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java @@ -0,0 +1,18 @@ +package org.embeddedt.modernfix.tickables; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class TickableObjectManager { + private static final List TICKABLE_OBJECT_LIST = new CopyOnWriteArrayList<>(); + + public static void register(TickableObject object) { + TICKABLE_OBJECT_LIST.add(object); + } + + public static void runTick() { + for(TickableObject o : TICKABLE_OBJECT_LIST) { + o.tick(); + } + } +}