Repository: qibergames/futura
Pull request #5: Rework future completion and add atomic variable support
Author: login: AdvancedAntiSkid
Labels: name: released
Created: 2025-03-05T20:55:08Z | Merged: 2025-03-05T21:06:51Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Introduced a new, robust API for advanced concurrent variable operations, offering enhanced atomic and memory consistency support for both legacy and modern Java environments.

- **Refactor**
  - Updated and reorganized package structure and import statements to align with the latest branding, along with minor formatting improvements. 
  - Modified package declarations across multiple files to reflect the new namespace.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java b/src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java
new file mode 100644
index 0000000..6f22321
--- /dev/null
+++ b/src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java
@@ -0,0 +1,242 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import lombok.Getter;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.Field;
+import sun.misc.Unsafe;
+
+/**
+ * Represents an implementation of {@link VarHandle} for legacy java runtimes, that utilise the {@link Unsafe} API.
+ *
+ * @param <T> the type of the variable
+ */
+@Getter
+class LegacyVarHandle<T> implements VarHandle<T> {
+    /**
+     * The object that owns the field (either a class or an instance).
+     */
+    private final @NotNull Object handle;
+
+    /**
+     * The field to create a handle for.
+     */
+    private final @NotNull Field field;
+
+    /**
+     * The internal offset of the field.
+     */
+    private final long offset;
+
+    /**
+     * Create a new {@link LegacyVarHandle} for the specified field.
+     *
+     * @param handle the object that owns the field (either a class or an instance)
+     * @param field the field to create a handle for
+     * @param isStatic whether the field is static or not
+     */
+    public LegacyVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
+        this.handle = handle;
+        this.field = field;
+        this.offset = isStatic ? VarHandleSupport.UNSAFE.staticFieldOffset(field) : VarHandleSupport.UNSAFE.objectFieldOffset(field);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T get() {
+        verifyHandle();
+        return (T) VarHandleSupport.UNSAFE.getObject(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T get(@NotNull Object handle) {
+        return (T) VarHandleSupport.UNSAFE.getObject(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T getVolatile() {
+        verifyHandle();
+        return (T) VarHandleSupport.UNSAFE.getObjectVolatile(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T getVolatile(@NotNull Object handle) {
+        return (T) VarHandleSupport.UNSAFE.getObjectVolatile(handle, offset);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable
+     * was declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param value the new value of the variable
+     */
+    public void set(T value) {
+        verifyHandle();
+        VarHandleSupport.UNSAFE.putObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void set(@NotNull Object handle, T value) {
+        VarHandleSupport.UNSAFE.putObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable
+     * was declared {@code volatile}.
+     *
+     * @param value the new value of the variable
+     */
+    public void setVolatile(T value) {
+        verifyHandle();
+        VarHandleSupport.UNSAFE.putObjectVolatile(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setVolatile(@NotNull Object handle, T value) {
+        VarHandleSupport.UNSAFE.putObjectVolatile(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setLazy(T value) {
+        verifyHandle();
+        VarHandleSupport.UNSAFE.putOrderedObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setLazy(@NotNull Object handle, T value) {
+        VarHandleSupport.UNSAFE.putOrderedObject(handle, offset, value);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile}
+     * if the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected},
+     * as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    public boolean compareAndSet(T expected, T update) {
+        verifyHandle();
+        return VarHandleSupport.UNSAFE.compareAndSwapObject(handle, offset, expected, update);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    @Override
+    public boolean compareAndSet(@NotNull Object handle, T expected, T update) {
+        return VarHandleSupport.UNSAFE.compareAndSwapObject(handle, offset, expected, update);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    public T getAndSet(T newValue) {
+        verifyHandle();
+        T prev;
+        do {
+            prev = get();
+        } while (!compareAndSet(prev, newValue));
+        return prev;
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    @Override
+    public T getAndSet(@NotNull Object handle, T newValue) {
+        T prev;
+        do {
+            prev = get(handle);
+        } while (!compareAndSet(handle, prev, newValue));
+        return prev;
+    }
+
+    /**
+     * Check if the user is trying to invoke a function that requires an implicit handle.
+     */
+    private void verifyHandle() {
+        if (handle == VarHandleSupport.DUMMY_HANDLE)
+            throw new IllegalStateException("You must explicitly pass in a handle to use this function");
+    }
+}
diff --git a/src/main/java/com/qibergames/futura/concurrent/atomic/VarHandle.java b/src/main/java/com/qibergames/futura/concurrent/atomic/VarHandle.java
new file mode 100644
index 0000000..eb58a4f
--- /dev/null
+++ b/src/main/java/com/qibergames/futura/concurrent/atomic/VarHandle.java
@@ -0,0 +1,240 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.Field;
+
+/**
+ * Represents dynamically strongly typed reference to a variable, or to a parametrically-defined family of variables,
+ * including static fields, non-static fields, array elements, or components of an off-heap data structure.
+ * <p>
+ * This interface is an abstraction over the legacy Unsafe, and the modern jdk VarHandle. This system will decide
+ * which version to use, depending on the underlying platform.
+ * <p>
+ * Using this implementation does not necessarily cause performance penalties. The JVM will likely inline virtual
+ * calls for frequent use of {@link VarHandle}s.
+ *
+ * @param <T> the type of the variable
+ */
+public interface VarHandle<T> {
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @return the held value of the variable
+     */
+    T get();
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    T get(@NotNull Object handle);
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @return the held value of the variable
+     */
+    T getVolatile();
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    T getVolatile(@NotNull Object handle);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param value the new value of the variable
+     */
+    void set(T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    void set(@NotNull Object handle, T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param value the new value of the variable
+     */
+    void setVolatile(T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    void setVolatile(@NotNull Object handle, T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param value the new value of the variable
+     */
+    void setLazy(T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    void setLazy(@NotNull Object handle, T value);
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    boolean compareAndSet(T expected, T update);
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    boolean compareAndSet(@NotNull Object handle, T expected, T update);
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    T getAndSet(T newValue);
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    T getAndSet(@NotNull Object handle, T newValue);
+
+    /**
+     * Create a new {@link VarHandle} for the specified non-static {@code field} of an {@code instance}.
+     *
+     * @param instance the instance of the type which holds the field
+     * @param field the target field to create a handle for
+     **
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofInstance(@NotNull Object instance, @NotNull Field field) {
+        return VarHandleSupport.createVarHandle(instance, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified non-static {@code field} without a bound handle.
+     * <p>
+     * {@link VarHandle}s created this way must be passed an instance for each call.
+     *
+     * @param field the target field to create a handle for
+     **
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofInstance(@NotNull Field field) {
+        return VarHandleSupport.createVarHandle(VarHandleSupport.DUMMY_HANDLE, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified non-static {@code fieldName} of an {@code instance}.
+     *
+     * @param instance the instance of the type which holds the field
+     * @param fieldName the name of the target field to create a handle for
+     **
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofInstance(@NotNull Object instance, @NotNull String fieldName) {
+        Field field = VarHandleSupport.getField(instance, fieldName, false);
+        return VarHandleSupport.createVarHandle(instance, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified static {@code field} of a class {@code type}.
+     *
+     * @param type the class type which holds the field
+     * @param field the target field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofStatic(@NotNull Class<?> type, @NotNull Field field) {
+        return VarHandleSupport.createVarHandle(type, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified static {@code fieldName} of a class {@code type}.
+     *
+     * @param type the class type which holds the field
+     * @param fieldName the name of the target field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofStatic(@NotNull Class<?> type, @NotNull String fieldName) {
+        Field field = VarHandleSupport.getField(type, fieldName, true);
+        return VarHandleSupport.createVarHandle(type, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified static {@code field}.
+     *
+     * @param field the target field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofStatic(@NotNull Field field) {
+        return VarHandleSupport.createVarHandle(field.getDeclaringClass(), field, false);
+    }
+}
diff --git a/src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java b/src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java
new file mode 100644
index 0000000..3f26ec7
--- /dev/null
+++ b/src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java
@@ -0,0 +1,67 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import lombok.experimental.UtilityClass;
+import org.jetbrains.annotations.NotNull;
+import sun.misc.Unsafe;
+
+import java.lang.reflect.Field;
+
+/**
+ * Represents a utility class that manages the creation of {@link VarHandle}s.
+ */
+@UtilityClass
+class VarHandleSupport {
+    /**
+     * A placeholder value that is used to represent a dummy handle.
+     */
+    public static final Object DUMMY_HANDLE = new Object();
+
+    /**
+     * The singleton access to the {@link Unsafe} system.
+     */
+    public final Unsafe UNSAFE = getUnsafe();
+
+    /**
+     * Create a new {@link VarHandle} based on the underlying platform.
+     *
+     * @param handle the object that owns the field (either a class or an instance)
+     * @param field the field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    public <T> @NotNull VarHandle<T> createVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
+        // TODO create jdk native var handle for jdk9+
+        return new LegacyVarHandle<>(handle, field, isStatic);
+    }
+
+    /**
+     * Retrieve the field from the specified handle.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param fieldName the name of the field
+     * @param isStatic whether the field is static or not
+     *
+     * @return the resolved field
+     */
+    public @NotNull Field getField(@NotNull Object handle, @NotNull String fieldName, boolean isStatic) {
+        Class<?> type = isStatic ? (Class<?>) handle : handle.getClass();
+        try {
+            return type.getDeclaredField(fieldName);
+        } catch (NoSuchFieldException e) {
+            throw new IllegalStateException("No such field: " + fieldName, e);
+        }
+    }
+
+    // attempt to resolve the Unsafe instance
+    private static @NotNull Unsafe getUnsafe() {
+        try {
+            Field field = Unsafe.class.getDeclaredField("theUnsafe");
+            field.setAccessible(true);
+            return (Unsafe) field.get(null);
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to get Unsafe", e);
+        }
+    }
+}
diff --git a/src/main/java/com/atlas/futura/concurrent/future/Callback.java b/src/main/java/com/qibergames/futura/concurrent/future/Callback.java
similarity index 97%
rename from src/main/java/com/atlas/futura/concurrent/future/Callback.java
rename to src/main/java/com/qibergames/futura/concurrent/future/Callback.java
index a953b84..1c049b8 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/Callback.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/Callback.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.future;
+package com.qibergames.futura.concurrent.future;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import org.jetbrains.annotations.NotNull;
diff --git a/src/main/java/com/atlas/futura/concurrent/future/Future.java b/src/main/java/com/qibergames/futura/concurrent/future/Future.java
similarity index 99%
rename from src/main/java/com/atlas/futura/concurrent/future/Future.java
rename to src/main/java/com/qibergames/futura/concurrent/future/Future.java
index c2d6107..341dd5e 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/Future.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/Future.java
@@ -1,11 +1,11 @@
-package com.atlas.futura.concurrent.future;
-
-import com.atlas.futura.concurrent.threading.Threading;
-import com.atlas.futura.function.ThrowableConsumer;
-import com.atlas.futura.function.ThrowableFunction;
-import com.atlas.futura.function.ThrowableRunnable;
-import com.atlas.futura.function.ThrowableSupplier;
-import com.atlas.futura.util.Validator;
+package com.qibergames.futura.concurrent.future;
+
+import com.qibergames.futura.concurrent.threading.Threading;
+import com.qibergames.futura.function.ThrowableConsumer;
+import com.qibergames.futura.function.ThrowableFunction;
+import com.qibergames.futura.function.ThrowableRunnable;
+import com.qibergames.futura.function.ThrowableSupplier;
+import com.qibergames.futura.verification.Validator;
 import com.google.common.collect.MapMaker;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.CheckReturnValue;
diff --git a/src/main/java/com/atlas/futura/concurrent/future/FutureExecutionException.java b/src/main/java/com/qibergames/futura/concurrent/future/FutureExecutionException.java
similarity index 97%
rename from src/main/java/com/atlas/futura/concurrent/future/FutureExecutionException.java
rename to src/main/java/com/qibergames/futura/concurrent/future/FutureExecutionException.java
index a4dd7d5..937aed1 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/FutureExecutionException.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/FutureExecutionException.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.future;
+package com.qibergames.futura.concurrent.future;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/com/atlas/futura/concurrent/future/FutureResolver.java b/src/main/java/com/qibergames/futura/concurrent/future/FutureResolver.java
similarity index 98%
rename from src/main/java/com/atlas/futura/concurrent/future/FutureResolver.java
rename to src/main/java/com/qibergames/futura/concurrent/future/FutureResolver.java
index 66d1d4c..16cce77 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/FutureResolver.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/FutureResolver.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.future;
+package com.qibergames.futura.concurrent.future;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import lombok.Getter;
diff --git a/src/main/java/com/atlas/futura/concurrent/future/FutureTimeoutException.java b/src/main/java/com/qibergames/futura/concurrent/future/FutureTimeoutException.java
similarity index 91%
rename from src/main/java/com/atlas/futura/concurrent/future/FutureTimeoutException.java
rename to src/main/java/com/qibergames/futura/concurrent/future/FutureTimeoutException.java
index cef6743..e0b6982 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/FutureTimeoutException.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/FutureTimeoutException.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.future;
+package com.qibergames.futura.concurrent.future;
 
 import lombok.Getter;
 
diff --git a/src/main/java/com/atlas/futura/concurrent/future/Promise.java b/src/main/java/com/qibergames/futura/concurrent/future/Promise.java
similarity index 99%
rename from src/main/java/com/atlas/futura/concurrent/future/Promise.java
rename to src/main/java/com/qibergames/futura/concurrent/future/Promise.java
index e574e8c..0f71f57 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/Promise.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/Promise.java
@@ -1,8 +1,7 @@
-package com.atlas.futura.concurrent.future;
+package com.qibergames.futura.concurrent.future;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.CheckReturnValue;
-import lombok.SneakyThrows;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
diff --git a/src/main/java/com/atlas/futura/concurrent/future/Resolver.java b/src/main/java/com/qibergames/futura/concurrent/future/Resolver.java
similarity index 95%
rename from src/main/java/com/atlas/futura/concurrent/future/Resolver.java
rename to src/main/java/com/qibergames/futura/concurrent/future/Resolver.java
index 955174c..1b2a222 100644
--- a/src/main/java/com/atlas/futura/concurrent/future/Resolver.java
+++ b/src/main/java/com/qibergames/futura/concurrent/future/Resolver.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.future;
+package com.qibergames.futura.concurrent.future;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
diff --git a/src/main/java/com/atlas/futura/concurrent/threading/Threading.java b/src/main/java/com/qibergames/futura/concurrent/threading/Threading.java
similarity index 96%
rename from src/main/java/com/atlas/futura/concurrent/threading/Threading.java
rename to src/main/java/com/qibergames/futura/concurrent/threading/Threading.java
index c6b12cf..a752293 100644
--- a/src/main/java/com/atlas/futura/concurrent/threading/Threading.java
+++ b/src/main/java/com/qibergames/futura/concurrent/threading/Threading.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.threading;
+package com.qibergames.futura.concurrent.threading;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import lombok.SneakyThrows;
diff --git a/src/main/java/com/atlas/futura/concurrent/threading/UnhandledExceptionReporter.java b/src/main/java/com/qibergames/futura/concurrent/threading/UnhandledExceptionReporter.java
similarity index 93%
rename from src/main/java/com/atlas/futura/concurrent/threading/UnhandledExceptionReporter.java
rename to src/main/java/com/qibergames/futura/concurrent/threading/UnhandledExceptionReporter.java
index de9d2e9..eb45030 100644
--- a/src/main/java/com/atlas/futura/concurrent/threading/UnhandledExceptionReporter.java
+++ b/src/main/java/com/qibergames/futura/concurrent/threading/UnhandledExceptionReporter.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.concurrent.threading;
+package com.qibergames.futura.concurrent.threading;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/com/atlas/futura/data/convertible/ConversionException.java b/src/main/java/com/qibergames/futura/data/convertible/ConversionException.java
similarity index 96%
rename from src/main/java/com/atlas/futura/data/convertible/ConversionException.java
rename to src/main/java/com/qibergames/futura/data/convertible/ConversionException.java
index 3e7e957..851f1b7 100644
--- a/src/main/java/com/atlas/futura/data/convertible/ConversionException.java
+++ b/src/main/java/com/qibergames/futura/data/convertible/ConversionException.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.data.convertible;
+package com.qibergames.futura.data.convertible;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/com/atlas/futura/data/convertible/Convertible.java b/src/main/java/com/qibergames/futura/data/convertible/Convertible.java
similarity index 99%
rename from src/main/java/com/atlas/futura/data/convertible/Convertible.java
rename to src/main/java/com/qibergames/futura/data/convertible/Convertible.java
index cf224ca..dd01d55 100644
--- a/src/main/java/com/atlas/futura/data/convertible/Convertible.java
+++ b/src/main/java/com/qibergames/futura/data/convertible/Convertible.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.data.convertible;
+package com.qibergames.futura.data.convertible;
 
 import com.google.errorprone.annotations.CheckReturnValue;
 import org.jetbrains.annotations.NotNull;
diff --git a/src/main/java/com/atlas/futura/function/ThrowableConsumer.java b/src/main/java/com/qibergames/futura/function/ThrowableConsumer.java
similarity index 98%
rename from src/main/java/com/atlas/futura/function/ThrowableConsumer.java
rename to src/main/java/com/qibergames/futura/function/ThrowableConsumer.java
index 07a2c6f..ba19a29 100644
--- a/src/main/java/com/atlas/futura/function/ThrowableConsumer.java
+++ b/src/main/java/com/qibergames/futura/function/ThrowableConsumer.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.function;
+package com.qibergames.futura.function;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/com/atlas/futura/function/ThrowableFunction.java b/src/main/java/com/qibergames/futura/function/ThrowableFunction.java
similarity index 98%
rename from src/main/java/com/atlas/futura/function/ThrowableFunction.java
rename to src/main/java/com/qibergames/futura/function/ThrowableFunction.java
index a67ecb3..6780b32 100644
--- a/src/main/java/com/atlas/futura/function/ThrowableFunction.java
+++ b/src/main/java/com/qibergames/futura/function/ThrowableFunction.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.function;
+package com.qibergames.futura.function;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/com/atlas/futura/function/ThrowableRunnable.java b/src/main/java/com/qibergames/futura/function/ThrowableRunnable.java
similarity index 98%
rename from src/main/java/com/atlas/futura/function/ThrowableRunnable.java
rename to src/main/java/com/qibergames/futura/function/ThrowableRunnable.java
index 61d3747..a4c8717 100644
--- a/src/main/java/com/atlas/futura/function/ThrowableRunnable.java
+++ b/src/main/java/com/qibergames/futura/function/ThrowableRunnable.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.function;
+package com.qibergames.futura.function;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/com/atlas/futura/function/ThrowableSupplier.java b/src/main/java/com/qibergames/futura/function/ThrowableSupplier.java
similarity index 96%
rename from src/main/java/com/atlas/futura/function/ThrowableSupplier.java
rename to src/main/java/com/qibergames/futura/function/ThrowableSupplier.java
index 2436e76..e2fd268 100644
--- a/src/main/java/com/atlas/futura/function/ThrowableSupplier.java
+++ b/src/main/java/com/qibergames/futura/function/ThrowableSupplier.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.function;
+package com.qibergames.futura.function;
 
 import org.jetbrains.annotations.NotNull;
 
@@ -46,7 +46,7 @@ public interface ThrowableSupplier<T, E extends Throwable> {
      *
      * @param <T> the type of the result
      * @param <E> the type of the exception
-     * 
+     *
      * @return the throwable supplier representation
      */
     static <T, E extends Throwable> @NotNull ThrowableSupplier<T, E> fomSupplier(@NotNull Supplier<T> supplier) {
diff --git a/src/main/java/com/atlas/futura/util/Validator.java b/src/main/java/com/qibergames/futura/verification/Validator.java
similarity index 93%
rename from src/main/java/com/atlas/futura/util/Validator.java
rename to src/main/java/com/qibergames/futura/verification/Validator.java
index c0edd7a..1c1cce9 100644
--- a/src/main/java/com/atlas/futura/util/Validator.java
+++ b/src/main/java/com/qibergames/futura/verification/Validator.java
@@ -1,4 +1,4 @@
-package com.atlas.futura.util;
+package com.qibergames.futura.verification;
 
 import lombok.experimental.UtilityClass;
 import org.jetbrains.annotations.NotNull;


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 3**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java (1)</summary><blockquote>

`5-5`: **Consider phasing out sun.misc.Unsafe.**  
Using `sun.misc.Unsafe` is risky, as it is an internal proprietary API and may be removed in a future release ([reference](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/)). Consider migrating to `java.lang.invoke.VarHandle` introduced in Java 9 or other supported concurrency mechanisms that grant similar low-level control in a more forward-compatible manner.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 GitHub Actions: Gradle CI</summary>

[warning] 5-5: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between a137af52608a8ea883daad6a1f65d39a6abeff24 and b2cce55e78229d83a8072e3d208172287d09bd80.

</details>

<details>
<summary>📒 Files selected for processing (19)</summary>

* `src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/atomic/VarHandle.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/Callback.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/Future.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/FutureExecutionException.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/FutureResolver.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/FutureTimeoutException.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/Promise.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/future/Resolver.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/threading/Threading.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/threading/UnhandledExceptionReporter.java` (1 hunks)
* `src/main/java/com/qibergames/futura/data/convertible/ConversionException.java` (1 hunks)
* `src/main/java/com/qibergames/futura/data/convertible/Convertible.java` (1 hunks)
* `src/main/java/com/qibergames/futura/function/ThrowableConsumer.java` (1 hunks)
* `src/main/java/com/qibergames/futura/function/ThrowableFunction.java` (1 hunks)
* `src/main/java/com/qibergames/futura/function/ThrowableRunnable.java` (1 hunks)
* `src/main/java/com/qibergames/futura/function/ThrowableSupplier.java` (2 hunks)
* `src/main/java/com/qibergames/futura/util/Validator.java` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (16)</summary>

* src/main/java/com/qibergames/futura/function/ThrowableFunction.java
* src/main/java/com/qibergames/futura/function/ThrowableConsumer.java
* src/main/java/com/qibergames/futura/concurrent/future/FutureTimeoutException.java
* src/main/java/com/qibergames/futura/util/Validator.java
* src/main/java/com/qibergames/futura/data/convertible/ConversionException.java
* src/main/java/com/qibergames/futura/concurrent/future/Resolver.java
* src/main/java/com/qibergames/futura/concurrent/future/Callback.java
* src/main/java/com/qibergames/futura/concurrent/future/FutureExecutionException.java
* src/main/java/com/qibergames/futura/function/ThrowableRunnable.java
* src/main/java/com/qibergames/futura/concurrent/threading/UnhandledExceptionReporter.java
* src/main/java/com/qibergames/futura/concurrent/threading/Threading.java
* src/main/java/com/qibergames/futura/function/ThrowableSupplier.java
* src/main/java/com/qibergames/futura/concurrent/future/Promise.java
* src/main/java/com/qibergames/futura/concurrent/future/FutureResolver.java
* src/main/java/com/qibergames/futura/data/convertible/Convertible.java
* src/main/java/com/qibergames/futura/concurrent/future/Future.java

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 GitHub Actions: Gradle CI</summary>

<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java</summary>

[warning] 5-5: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[warning] 22-22: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[warning] 60-60: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[error] 62-62: non-static variable UNSAFE cannot be referenced from a static context

</details>
<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java</summary>

[warning] 5-5: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[error] 7-7: cannot find symbol: static UNSAFE

---

[error] 42-42: cannot find symbol: variable UNSAFE

---

[error] 55-55: cannot find symbol: variable UNSAFE

---

[error] 68-68: cannot find symbol: variable UNSAFE

---

[error] 81-81: cannot find symbol: variable UNSAFE

---

[error] 94-94: cannot find symbol: variable UNSAFE

---

[error] 105-105: cannot find symbol: variable UNSAFE

---

[error] 117-117: cannot find symbol: variable UNSAFE

---

[error] 128-128: cannot find symbol: variable UNSAFE

---

[error] 140-140: cannot find symbol: variable UNSAFE

---

[error] 155-155: cannot find symbol: variable UNSAFE

---

[error] 170-170: cannot find symbol: variable UNSAFE

---

[error] 185-185: cannot find symbol: variable UNSAFE

</details>
<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/VarHandle.java</summary>

[error] 166-166: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 181-181: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 195-195: non-static method getField(Object, String, boolean) cannot be referenced from a static context

---

[error] 196-196: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 210-210: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 224-224: non-static method getField(Object, String, boolean) cannot be referenced from a static context

---

[error] 225-225: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 238-238: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 255-255: non-static method getField(Object, String, boolean) cannot be referenced from a static context

</details>

</details>

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-05T20:58:09Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>♻️ Duplicate comments (1)</summary><blockquote>

<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java (1)</summary><blockquote>

`22-22`: _🛠️ Refactor suggestion_

**Explicitly declare the `UNSAFE` field as `static` to prevent pipeline errors**  
Because this utility class is annotated with `@UtilityClass`, all members are effectively static. However, previous pipeline logs indicated failures when `UNSAFE` was not explicitly declared as `static`. Making this field explicitly static will help avoid confusion and align with the Lombok utility class convention.  

```diff
-    public final Unsafe UNSAFE = getUnsafe();
+    public static final Unsafe UNSAFE = getUnsafe();
```

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java (1)</summary><blockquote>

`58-66`: **Using `sun.misc.Unsafe` is not future-proof**  
The `sun.misc.Unsafe` API is internal and may be removed or restricted in future Java versions. For newer Java runtimes, prefer `java.lang.invoke.VarHandle` for safer and more standard functionality.

</blockquote></details>
<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java (1)</summary><blockquote>

`209-216`: **Consider directly using `Unsafe` built-in getAndSet methods if available**  
The manual loop with `compareAndSet` is correct but can be less efficient under high contention. Some Java versions provide `Unsafe.getAndSetObject(...)`, which handles the operation atomically in a single step. Using that method could improve performance if running on a JVM that supports it.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b2cce55e78229d83a8072e3d208172287d09bd80 and dc44c272d6293b7531ea620173ef792903174acb.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java` (1 hunks)
* `src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (1)</summary><blockquote>

<details>
<summary>src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java (1)</summary>

`48-55`: **Consider making private fields accessible if required**  
If the code needs to manipulate private or protected fields, ensure that `setAccessible(true)` is called on the returned field before obtaining its offset. Otherwise, reflective access may fail under stricter security managers or later Java versions.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-05T21:01:37Z

Review comments:
diff_hunk: @@ -0,0 +1,67 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import lombok.experimental.UtilityClass;
+import org.jetbrains.annotations.NotNull;
+import sun.misc.Unsafe;
+
+import java.lang.reflect.Field;
+
+/**
+ * Represents a utility class that manages the creation of {@link VarHandle}s.
+ */
+@UtilityClass
+class VarHandleSupport {
+    /**
+     * A placeholder value that is used to represent a dummy handle.
+     */
+    public static final Object DUMMY_HANDLE = new Object();
+
+    /**
+     * The singleton access to the {@link Unsafe} system.
+     */
+    public final Unsafe UNSAFE;
+
+    /**
+     * Create a new {@link VarHandle} based on the underlying platform.
+     *
+     * @param handle the object that owns the field (either a class or an instance)
+     * @param field the field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    public <T> @NotNull VarHandle<T> createVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
+        // TODO create jdk native var handle for jdk9+
+        return new LegacyVarHandle<>(handle, field, isStatic);
+    }
+
+    /**
+     * Retrieve the field from the specified handle.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param fieldName the name of the field
+     * @param isStatic whether the field is static or not
+     *
+     * @return the resolved field
+     */
+    public @NotNull Field getField(@NotNull Object handle, @NotNull String fieldName, boolean isStatic) {
+        Class<?> type = isStatic ? (Class<?>) handle : handle.getClass();
+        try {
+            return type.getDeclaredField(fieldName);
+        } catch (NoSuchFieldException e) {
+            throw new IllegalStateException("No such field: " + fieldName, e);
+        }
+    }
+
+    // attempt to resolve the Unsafe instance
+    static {
+        try {
+            Field field = Unsafe.class.getDeclaredField("theUnsafe");
+            field.setAccessible(true);
+            UNSAFE = (Unsafe) field.get(null);
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to get Unsafe", e);
+        }
+    }
path: src/main/java/com/qibergames/futura/concurrent/atomic/VarHandleSupport.java
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix the pipeline errors by making `UNSAFE`, `createVarHandle()`, and `getField()` static.**  
Because you’re referencing these members from static contexts in other files and within a static initializer here, declaring them as non-static causes compilation errors. To comply with Lombok’s `@UtilityClass` convention (all-static members) and resolve the pipeline failures, apply the following changes:



```diff
-    public final Unsafe UNSAFE;
+    public static final Unsafe UNSAFE;

-    public <T> @NotNull VarHandle<T> createVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
+    public static <T> @NotNull VarHandle<T> createVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {

-    public @NotNull Field getField(@NotNull Object handle, @NotNull String fieldName, boolean isStatic) {
+    public static @NotNull Field getField(@NotNull Object handle, @NotNull String fieldName, boolean isStatic) {
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
    public static final Unsafe UNSAFE;

    /**
     * Create a new {@link VarHandle} based on the underlying platform.
     *
     * @param handle the object that owns the field (either a class or an instance)
     * @param field the field to create a handle for
     *
     * @return a new {@link VarHandle} for the {@code field}
     *
     * @param <T> the type of the field
     */
    public static <T> @NotNull VarHandle<T> createVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
        // TODO create jdk native var handle for jdk9+
        return new LegacyVarHandle<>(handle, field, isStatic);
    }

    /**
     * Retrieve the field from the specified handle.
     *
     * @param handle the holder of the field (either a class or an instance)
     * @param fieldName the name of the field
     * @param isStatic whether the field is static or not
     *
     * @return the resolved field
     */
    public static @NotNull Field getField(@NotNull Object handle, @NotNull String fieldName, boolean isStatic) {
        Class<?> type = isStatic ? (Class<?>) handle : handle.getClass();
        try {
            return type.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            throw new IllegalStateException("No such field: " + fieldName, e);
        }
    }

    // attempt to resolve the Unsafe instance
    static {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            UNSAFE = (Unsafe) field.get(null);
        } catch (Exception e) {
            throw new RuntimeException("Failed to get Unsafe", e);
        }
    }
`````

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 GitHub Actions: Gradle CI</summary>

[warning] 22-22: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[warning] 60-60: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[error] 62-62: non-static variable UNSAFE cannot be referenced from a static context

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-05T20:58:08Z
author_association: NONE
diff_hunk: @@ -0,0 +1,240 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.Field;
+
+/**
+ * Represents dynamically strongly typed reference to a variable, or to a parametrically-defined family of variables,
+ * including static fields, non-static fields, array elements, or components of an off-heap data structure.
+ * <p>
+ * This interface is an abstraction over the legacy Unsafe, and the modern jdk VarHandle. This system will decide
+ * which version to use, depending on the underlying platform.
+ * <p>
+ * Using this implementation does not necessarily cause performance penalties. The JVM will likely inline virtual
+ * calls for frequent use of {@link VarHandle}s.
+ *
+ * @param <T> the type of the variable
+ */
+public interface VarHandle<T> {
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @return the held value of the variable
+     */
+    T get();
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    T get(@NotNull Object handle);
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @return the held value of the variable
+     */
+    T getVolatile();
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    T getVolatile(@NotNull Object handle);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param value the new value of the variable
+     */
+    void set(T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    void set(@NotNull Object handle, T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param value the new value of the variable
+     */
+    void setVolatile(T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    void setVolatile(@NotNull Object handle, T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param value the new value of the variable
+     */
+    void setLazy(T value);
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    void setLazy(@NotNull Object handle, T value);
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    boolean compareAndSet(T expected, T update);
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    boolean compareAndSet(@NotNull Object handle, T expected, T update);
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    T getAndSet(T newValue);
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    T getAndSet(@NotNull Object handle, T newValue);
+
+    /**
+     * Create a new {@link VarHandle} for the specified non-static {@code field} of an {@code instance}.
+     *
+     * @param instance the instance of the type which holds the field
+     * @param field the target field to create a handle for
+     **
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofInstance(@NotNull Object instance, @NotNull Field field) {
+        return VarHandleSupport.createVarHandle(instance, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified non-static {@code field} without a bound handle.
+     * <p>
+     * {@link VarHandle}s created this way must be passed an instance for each call.
+     *
+     * @param field the target field to create a handle for
+     **
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofInstance(@NotNull Field field) {
+        return VarHandleSupport.createVarHandle(VarHandleSupport.DUMMY_HANDLE, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified non-static {@code fieldName} of an {@code instance}.
+     *
+     * @param instance the instance of the type which holds the field
+     * @param fieldName the name of the target field to create a handle for
+     **
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofInstance(@NotNull Object instance, @NotNull String fieldName) {
+        Field field = VarHandleSupport.getField(instance, fieldName, false);
+        return VarHandleSupport.createVarHandle(instance, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified static {@code field} of a class {@code type}.
+     *
+     * @param type the class type which holds the field
+     * @param field the target field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofStatic(@NotNull Class<?> type, @NotNull Field field) {
+        return VarHandleSupport.createVarHandle(type, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified static {@code fieldName} of a class {@code type}.
+     *
+     * @param type the class type which holds the field
+     * @param fieldName the name of the target field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofStatic(@NotNull Class<?> type, @NotNull String fieldName) {
+        Field field = VarHandleSupport.getField(type, fieldName, true);
+        return VarHandleSupport.createVarHandle(type, field, false);
+    }
+
+    /**
+     * Create a new {@link VarHandle} for the specified static {@code field}.
+     *
+     * @param field the target field to create a handle for
+     *
+     * @return a new {@link VarHandle} for the specified {@code field}
+     *
+     * @param <T> the type of the field
+     */
+    static <T> @NotNull VarHandle<T> ofStatic(@NotNull Field field) {
+        return VarHandleSupport.createVarHandle(field.getDeclaringClass(), field, false);
+    }
path: src/main/java/com/qibergames/futura/concurrent/atomic/VarHandle.java
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Resolve non-static method reference errors.**  
Calls to `VarHandleSupport.createVarHandle(...)` and `VarHandleSupport.getField(...)` fail because these methods are currently non-static. Once you apply the static fix in `VarHandleSupport`, these references are valid.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 GitHub Actions: Gradle CI</summary>

[error] 166-166: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 181-181: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 195-195: non-static method getField(Object, String, boolean) cannot be referenced from a static context

---

[error] 196-196: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 210-210: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 224-224: non-static method getField(Object, String, boolean) cannot be referenced from a static context

---

[error] 225-225: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

---

[error] 238-238: non-static method createVarHandle(Object, Field, boolean) cannot be referenced from a static context

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-05T20:58:08Z
author_association: NONE
diff_hunk: @@ -0,0 +1,243 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import lombok.Getter;
+import org.jetbrains.annotations.NotNull;
+import sun.misc.Unsafe;
+
+import static com.qibergames.futura.concurrent.atomic.VarHandleSupport.UNSAFE;
+import java.lang.reflect.Field;
+
+/**
+ * Represents an implementation of {@link VarHandle} for legacy java runtimes, that utilise the {@link Unsafe} API.
+ *
+ * @param <T> the type of the variable
+ */
+@Getter
+class LegacyVarHandle<T> implements VarHandle<T> {
+    /**
+     * The object that owns the field (either a class or an instance).
+     */
+    private final @NotNull Object handle;
+
+    /**
+     * The field to create a handle for.
+     */
+    private final @NotNull Field field;
+
+    /**
+     * The internal offset of the field.
+     */
+    private final long offset;
+
+    /**
+     * Create a new {@link LegacyVarHandle} for the specified field.
+     *
+     * @param handle the object that owns the field (either a class or an instance)
+     * @param field the field to create a handle for
+     * @param isStatic whether the field is static or not
+     */
+    public LegacyVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
+        this.handle = handle;
+        this.field = field;
+        this.offset = isStatic ? UNSAFE.staticFieldOffset(field) : UNSAFE.objectFieldOffset(field);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T get() {
+        verifyHandle();
+        return (T) UNSAFE.getObject(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T get(@NotNull Object handle) {
+        return (T) UNSAFE.getObject(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T getVolatile() {
+        verifyHandle();
+        return (T) UNSAFE.getObjectVolatile(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T getVolatile(@NotNull Object handle) {
+        return (T) UNSAFE.getObjectVolatile(handle, offset);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable
+     * was declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param value the new value of the variable
+     */
+    public void set(T value) {
+        verifyHandle();
+        UNSAFE.putObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void set(@NotNull Object handle, T value) {
+        UNSAFE.putObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable
+     * was declared {@code volatile}.
+     *
+     * @param value the new value of the variable
+     */
+    public void setVolatile(T value) {
+        verifyHandle();
+        UNSAFE.putObjectVolatile(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setVolatile(@NotNull Object handle, T value) {
+        UNSAFE.putObjectVolatile(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setLazy(T value) {
+        verifyHandle();
+        UNSAFE.putOrderedObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setLazy(@NotNull Object handle, T value) {
+        UNSAFE.putOrderedObject(handle, offset, value);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile}
+     * if the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected},
+     * as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    public boolean compareAndSet(T expected, T update) {
+        verifyHandle();
+        return UNSAFE.compareAndSwapObject(handle, offset, expected, update);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    @Override
+    public boolean compareAndSet(@NotNull Object handle, T expected, T update) {
+        return UNSAFE.compareAndSwapObject(handle, offset, expected, update);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    public T getAndSet(T newValue) {
+        verifyHandle();
+        T prev;
+        do {
+            prev = get();
+        } while (!compareAndSet(prev, newValue));
+        return prev;
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    @Override
+    public T getAndSet(@NotNull Object handle, T newValue) {
+        T prev;
+        do {
+            prev = get();
+        } while (!compareAndSet(prev, newValue));
+        return prev;
+    }
+
+    /**
+     * Check if the user is trying to invoke a function that requires an implicit handle.
+     */
+    private void verifyHandle() {
+        if (handle == VarHandleSupport.DUMMY_HANDLE)
+            throw new IllegalStateException("You must explicitly pass in a handle to use this function");
+    }
+}
path: src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Address missing static import target for `UNSAFE`.**  
All references to `UNSAFE` fail at compile time because it isn’t declared as a static field in `VarHandleSupport`. After making `UNSAFE` static in `VarHandleSupport`, this file should build successfully without modifications.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 GitHub Actions: Gradle CI</summary>

[warning] 5-5: sun.misc.Unsafe is internal proprietary API and may be removed in a future release

---

[error] 7-7: cannot find symbol: static UNSAFE

---

[error] 42-42: cannot find symbol: variable UNSAFE

---

[error] 55-55: cannot find symbol: variable UNSAFE

---

[error] 68-68: cannot find symbol: variable UNSAFE

---

[error] 81-81: cannot find symbol: variable UNSAFE

---

[error] 94-94: cannot find symbol: variable UNSAFE

---

[error] 105-105: cannot find symbol: variable UNSAFE

---

[error] 117-117: cannot find symbol: variable UNSAFE

---

[error] 128-128: cannot find symbol: variable UNSAFE

---

[error] 140-140: cannot find symbol: variable UNSAFE

---

[error] 155-155: cannot find symbol: variable UNSAFE

---

[error] 170-170: cannot find symbol: variable UNSAFE

---

[error] 185-185: cannot find symbol: variable UNSAFE

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-05T20:58:08Z
author_association: NONE
diff_hunk: @@ -0,0 +1,242 @@
+package com.qibergames.futura.concurrent.atomic;
+
+import lombok.Getter;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.Field;
+import sun.misc.Unsafe;
+
+/**
+ * Represents an implementation of {@link VarHandle} for legacy java runtimes, that utilise the {@link Unsafe} API.
+ *
+ * @param <T> the type of the variable
+ */
+@Getter
+class LegacyVarHandle<T> implements VarHandle<T> {
+    /**
+     * The object that owns the field (either a class or an instance).
+     */
+    private final @NotNull Object handle;
+
+    /**
+     * The field to create a handle for.
+     */
+    private final @NotNull Field field;
+
+    /**
+     * The internal offset of the field.
+     */
+    private final long offset;
+
+    /**
+     * Create a new {@link LegacyVarHandle} for the specified field.
+     *
+     * @param handle the object that owns the field (either a class or an instance)
+     * @param field the field to create a handle for
+     * @param isStatic whether the field is static or not
+     */
+    public LegacyVarHandle(@NotNull Object handle, @NotNull Field field, boolean isStatic) {
+        this.handle = handle;
+        this.field = field;
+        this.offset = isStatic ? VarHandleSupport.UNSAFE.staticFieldOffset(field) : VarHandleSupport.UNSAFE.objectFieldOffset(field);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T get() {
+        verifyHandle();
+        return (T) VarHandleSupport.UNSAFE.getObject(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * non-{@code volatile}. Commonly referred to as plain read access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T get(@NotNull Object handle) {
+        return (T) VarHandleSupport.UNSAFE.getObject(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T getVolatile() {
+        verifyHandle();
+        return (T) VarHandleSupport.UNSAFE.getObjectVolatile(handle, offset);
+    }
+
+    /**
+     * Retrieve the value of the variable, with memory semantics of reading as if the variable was declared
+     * {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @return the held value of the variable
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public T getVolatile(@NotNull Object handle) {
+        return (T) VarHandleSupport.UNSAFE.getObjectVolatile(handle, offset);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable
+     * was declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param value the new value of the variable
+     */
+    public void set(T value) {
+        verifyHandle();
+        VarHandleSupport.UNSAFE.putObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared non-{@code volatile} and non-{@code final}. Commonly referred to as plain write access.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void set(@NotNull Object handle, T value) {
+        VarHandleSupport.UNSAFE.putObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable
+     * was declared {@code volatile}.
+     *
+     * @param value the new value of the variable
+     */
+    public void setVolatile(T value) {
+        verifyHandle();
+        VarHandleSupport.UNSAFE.putObjectVolatile(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}, with memory semantics of setting as if the variable was
+     * declared {@code volatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setVolatile(@NotNull Object handle, T value) {
+        VarHandleSupport.UNSAFE.putObjectVolatile(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setLazy(T value) {
+        verifyHandle();
+        VarHandleSupport.UNSAFE.putOrderedObject(handle, offset, value);
+    }
+
+    /**
+     * Update the value of the variable to {@code newValue}.
+     * <p>
+     * This method acts like {@link #setVolatile(Object)}, except it does not guarantee immediate visibility of the
+     * store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if
+     * an array cell, one that is otherwise only accessed using volatile accesses).
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param value the new value of the variable
+     */
+    @Override
+    public void setLazy(@NotNull Object handle, T value) {
+        VarHandleSupport.UNSAFE.putOrderedObject(handle, offset, value);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile}
+     * if the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected},
+     * as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     *
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    public boolean compareAndSet(T expected, T update) {
+        verifyHandle();
+        return VarHandleSupport.UNSAFE.compareAndSwapObject(handle, offset, expected, update);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code update} with the memory semantics of {@link #setVolatile} if
+     * the variable's current value, referred to as the <em>witness value</em>, {@code ==} the {@code expected}, as
+     * accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param expected the condition of the update
+     * @param update the new value of the variable
+     * @return {@code true} if the value of the variable was changed, {@code false} otherwise
+     */
+    @Override
+    public boolean compareAndSet(@NotNull Object handle, T expected, T update) {
+        return VarHandleSupport.UNSAFE.compareAndSwapObject(handle, offset, expected, update);
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    public T getAndSet(T newValue) {
+        verifyHandle();
+        T prev;
+        do {
+            prev = get();
+        } while (!compareAndSet(prev, newValue));
+        return prev;
+    }
+
+    /**
+     * Atomically set the value of the variable to {@code newValue} with the memory semantics of {@link #setVolatile}
+     * and return the variable's previous value, as accessed with the memory semantics of {@link #getVolatile}.
+     *
+     * @param handle the holder of the field (either a class or an instance)
+     * @param newValue the new value of the variable
+     * @return the previous value of the variable
+     */
+    @Override
+    public T getAndSet(@NotNull Object handle, T newValue) {
+        T prev;
+        do {
+            prev = get();
+        } while (!compareAndSet(prev, newValue));
+        return prev;
+    }
path: src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix ignored handle parameter in `getAndSet(@NotNull Object handle, T newValue)`**  
This override method currently uses `this.handle` instead of the passed-in `handle`, causing incorrect behavior when the user supplies a different handle.  

Apply this diff to ensure the intended handle is used:

```diff
    public T getAndSet(@NotNull Object handle, T newValue) {
        T prev;
        do {
-            prev = get();
-        } while (!compareAndSet(prev, newValue));
+            prev = get(handle);
+        } while (!compareAndSet(handle, prev, newValue));
        return prev;
    }
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
    @Override
    public T getAndSet(@NotNull Object handle, T newValue) {
        T prev;
        do {
            prev = get(handle);
        } while (!compareAndSet(handle, prev, newValue));
        return prev;
    }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-05T21:01:37Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-03-05T20:55:15Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: rate limited by coderabbit.ai -->

> [!WARNING]
> ## Rate limit exceeded
> 
> @AdvancedAntiSkid has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait **14 minutes and 41 seconds** before requesting another review.
> 
> <details>
> <summary>⌛ How to resolve this issue?</summary>
> 
> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.
> 
> We recommend that you space out your commits to avoid hitting the rate limit.
> 
> </details>
> 
> 
> <details>
> <summary>🚦 How do rate limits work?</summary>
> 
> CodeRabbit enforces hourly rate limits for each developer per organization.
> 
> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.
> 
> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.
> 
> </details>
> 
> <details>
> <summary>📥 Commits</summary>
> 
> Reviewing files that changed from the base of the PR and between dc44c272d6293b7531ea620173ef792903174acb and 7d72e7fcbddf9d802452e6af97c1a0078e25e632.
> 
> </details>
> 
> <details>
> <summary>📒 Files selected for processing (3)</summary>
> 
> * `src/main/java/com/qibergames/futura/concurrent/atomic/LegacyVarHandle.java` (1 hunks)
> * `src/main/java/com/qibergames/futura/concurrent/future/Future.java` (1 hunks)
> * `src/main/java/com/qibergames/futura/verification/Validator.java` (1 hunks)
> 
> </details>

<!-- end of auto-generated comment: rate limited by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough
This pull request introduces a new legacy variable handle mechanism for legacy Java runtimes using the Unsafe API. It adds a new implementation class, an interface, and a corresponding utility class for creating and managing variable handles. Additionally, several files across different packages have updated their package declarations and import statements from `com.atlas.futura` to `com.qibergames.futura`, alongside minor formatting adjustments.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `src/main/.../atomic/LegacyVarHandle.java` | Added new class `LegacyVarHandle<T>` implementing `VarHandle<T>` for legacy runtimes with methods for plain, volatile, lazy read/write, compare-and-set, and get-and-set operations. |
| `src/main/.../atomic/VarHandle.java` | Introduced interface `VarHandle<T>` defining methods for variable access (plain, volatile, lazy), update operations, and static factory methods for instance and static fields. |
| `src/main/.../atomic/VarHandleSupport.java` | Added new utility class `VarHandleSupport` with methods to create a `VarHandle`, retrieve a field by name, a static block to resolve `Unsafe`, and a public constant dummy handle. |
| `src/main/.../concurrent/future/*` | Updated package names in `Callback.java`, `Future.java`, `FutureExecutionException.java`, `FutureResolver.java`, `FutureTimeoutException.java`, `Promise.java`, and `Resolver.java` from `com.atlas.futura.concurrent.future` to `com.qibergames.futura.concurrent.future`; also updated relevant imports and removed an unused import in `Promise.java`. |
| `src/main/.../concurrent/threading/*` | Updated package names in `Threading.java` and `UnhandledExceptionReporter.java` from `com.atlas.futura.concurrent.threading` to `com.qibergames.futura.concurrent.threading`. |
| `src/main/.../data/convertible/*` | Updated package names in `ConversionException.java` and `Convertible.java` from `com.atlas.futura.data.convertible` to `com.qibergames.futura.data.convertible`. |
| `src/main/.../function/*` | Updated package names in `ThrowableConsumer.java`, `ThrowableFunction.java`, `ThrowableRunnable.java`, and `ThrowableSupplier.java` from `com.atlas.futura.function` to `com.qibergames.futura.function`; applied minor formatting changes in `ThrowableSupplier.java`. |
| `src/main/.../util/Validator.java` | Updated package name from `com.atlas.futura.util` to `com.qibergames.futura.util`. |

## Sequence Diagram(s)
```mermaid
sequenceDiagram
    participant Client
    participant VarHandleSupport
    participant LegacyVarHandle
    Client->>VarHandleSupport: createVarHandle(object, field, isStatic)
    VarHandleSupport->>LegacyVarHandle: instantiate handle
    LegacyVarHandle-->>VarHandleSupport: return LegacyVarHandle instance
    VarHandleSupport-->>Client: return VarHandle
    Client->>LegacyVarHandle: get() / set() / compareAndSet(...)
    LegacyVarHandle-->>Client: operation result
```

## Poem
> Hopping through fields, I’ve found a new way,  
> Legacy handles in code, bright as day.  
> With each package renamed,  
> My heart is unchained,  
> A rabbit’s delight with every byte at play.  
> 🐇✨  
> CodeRabbit cheers on this joyful display!

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=qibergames/futura&utm_content=5):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: AdvancedAntiSkid
created_at: 2025-03-05T21:10:25Z
body: :tada: This PR is included in version 1.1.0 :tada:

The release is available on [GitHub release](https://github.com/qibergames/futura/releases/tag/v1.1.0)

Your **[semantic-release](https://github.com/semantic-release/semantic-release)** bot :package::rocket:
author_association: MEMBER