From d4f54201834d27e01aafa0dc4ac51a64c0fb029f Mon Sep 17 00:00:00 2001 From: Sotr Date: Sat, 11 Aug 2018 01:03:07 +0800 Subject: [PATCH] Fixes lock --- .../java/io/akarin/api/internal/Akari.java | 4 +-- .../internal/utils/ReentrantSpinningLock.java | 30 ------------------- 2 files changed, 2 insertions(+), 32 deletions(-) delete mode 100644 sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java diff --git a/sources/src/main/java/io/akarin/api/internal/Akari.java b/sources/src/main/java/io/akarin/api/internal/Akari.java index 71c21424b..ec4a03b56 100644 --- a/sources/src/main/java/io/akarin/api/internal/Akari.java +++ b/sources/src/main/java/io/akarin/api/internal/Akari.java @@ -8,6 +8,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.ReentrantLock; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -16,7 +17,6 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import co.aikar.timings.Timing; import co.aikar.timings.Timings; -import io.akarin.api.internal.utils.ReentrantSpinningLock; import io.akarin.server.core.AkarinGlobalConfig; import net.minecraft.server.MinecraftServer; @@ -94,7 +94,7 @@ public abstract class Akari { return serverVersion + " (MC: " + MinecraftServer.getServer().getVersion() + ")"; } - public static final ReentrantSpinningLock eventLock = new ReentrantSpinningLock(); + public static final ReentrantLock eventLock = new ReentrantLock(); /* * Timings diff --git a/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java b/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java deleted file mode 100644 index 70caadd7a..000000000 --- a/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.akarin.api.internal.utils; - -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -public class ReentrantSpinningLock { - private final AtomicBoolean attemptLock = new AtomicBoolean(false); - private final AtomicInteger reentrantLocks = new AtomicInteger(0); - private volatile long heldThreadId = 0; - - public void lock() { - long currentThreadId = Thread.currentThread().getId(); - if (heldThreadId == currentThreadId) { - reentrantLocks.getAndIncrement(); // Reentrant - } else { - while (heldThreadId != 0) ; // The current thread is spinning here - } - tryLock(currentThreadId); - } - - private void tryLock(long currentThreadId) { - attemptLock.getAndSet(true); // In case acquire one lock concurrently - heldThreadId = currentThreadId; - attemptLock.set(false); - } - - public void unlock() { - if (reentrantLocks.get() == 0 || reentrantLocks.getAndDecrement() == 1) heldThreadId = 0; - } -}