diff --git a/src/main/java/net/minestom/server/thread/MinestomThread.java b/src/main/java/net/minestom/server/thread/MinestomThread.java index c18104481..c293fd622 100644 --- a/src/main/java/net/minestom/server/thread/MinestomThread.java +++ b/src/main/java/net/minestom/server/thread/MinestomThread.java @@ -33,7 +33,7 @@ public class MinestomThread extends Thread { final int requiredLength = index + 1; if (array.length < requiredLength) { Object[] temp = new Object[requiredLength]; - System.arraycopy(temp, 0, temp, 0, array.length); + System.arraycopy(array, 0, temp, 0, index); array = temp; this.locals = array; } diff --git a/src/test/java/thread/LocalThreadCache.java b/src/test/java/thread/LocalThreadCache.java new file mode 100644 index 000000000..3a4f67b95 --- /dev/null +++ b/src/test/java/thread/LocalThreadCache.java @@ -0,0 +1,43 @@ +package thread; + +import net.minestom.server.thread.MinestomThread; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class LocalThreadCache { + + @Test + public void testLocalThreadCache() throws InterruptedException { + AtomicBoolean result = new AtomicBoolean(false); + var thread = new MinestomThread("name") { + @Override + public void run() { + final int dummy = -1; + + var value = localCache(0, () -> 5); + assertEquals(5, value); + + value = localCache(0, () -> dummy); + assertEquals(5, value); + + value = localCache(1, () -> 7); + assertEquals(7, value); + assertEquals(5, localCache(0, () -> dummy)); + + value = localCache(2, () -> 5); + assertEquals(5, value); + assertEquals(7, localCache(1, () -> dummy)); + assertEquals(5, localCache(0, () -> dummy)); + + result.set(true); + } + }; + thread.start(); + thread.join(1500); + assertTrue(result.get(), "Thread didn't start"); + } +}