Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-12-26 00:00:55 +01:00
Fix event ordering.
Dieser Commit ist enthalten in:
Ursprung
31aa996623
Commit
f79736b8b7
@ -22,7 +22,9 @@ import static java.util.Objects.requireNonNull;
|
|||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
import com.google.common.base.VerifyException;
|
import com.google.common.base.VerifyException;
|
||||||
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.HashMultimap;
|
||||||
|
import com.google.common.collect.ListMultimap;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.reflect.TypeToken;
|
import com.google.common.reflect.TypeToken;
|
||||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
@ -87,7 +89,7 @@ public class VelocityEventManager implements EventManager {
|
|||||||
private final ExecutorService asyncExecutor;
|
private final ExecutorService asyncExecutor;
|
||||||
private final PluginManager pluginManager;
|
private final PluginManager pluginManager;
|
||||||
|
|
||||||
private final Multimap<Class<?>, HandlerRegistration> handlersByType = HashMultimap.create();
|
private final ListMultimap<Class<?>, HandlerRegistration> handlersByType = ArrayListMultimap.create();
|
||||||
private final LoadingCache<Class<?>, HandlersCache> handlersCache =
|
private final LoadingCache<Class<?>, HandlersCache> handlersCache =
|
||||||
Caffeine.newBuilder().build(this::bakeHandlers);
|
Caffeine.newBuilder().build(this::bakeHandlers);
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import com.velocitypowered.api.event.PostOrder;
|
|||||||
import com.velocitypowered.api.event.Subscribe;
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
import com.velocitypowered.proxy.testutil.FakePluginManager;
|
import com.velocitypowered.proxy.testutil.FakePluginManager;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
import org.junit.jupiter.api.AfterAll;
|
import org.junit.jupiter.api.AfterAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -59,6 +60,33 @@ public class EventTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void listenerOrderPreserved() throws Exception {
|
||||||
|
final AtomicLong listenerAInvoked = new AtomicLong();
|
||||||
|
final AtomicLong listenerBInvoked = new AtomicLong();
|
||||||
|
final AtomicLong listenerCInvoked = new AtomicLong();
|
||||||
|
|
||||||
|
eventManager.register(FakePluginManager.PLUGIN_A, TestEvent.class, event -> {
|
||||||
|
listenerAInvoked.set(System.nanoTime());
|
||||||
|
});
|
||||||
|
eventManager.register(FakePluginManager.PLUGIN_B, TestEvent.class, event -> {
|
||||||
|
listenerBInvoked.set(System.nanoTime());
|
||||||
|
});
|
||||||
|
eventManager.register(FakePluginManager.PLUGIN_A, TestEvent.class, event -> {
|
||||||
|
listenerCInvoked.set(System.nanoTime());
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
eventManager.fire(new TestEvent()).get();
|
||||||
|
} finally {
|
||||||
|
eventManager.unregisterListeners(FakePluginManager.PLUGIN_A);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the order is A < B < C. Check only that A < B and B < C as B < C and A < B => A < C.
|
||||||
|
assertTrue(listenerAInvoked.get() < listenerBInvoked.get(), "Listener B invoked before A!");
|
||||||
|
assertTrue(listenerBInvoked.get() < listenerCInvoked.get(), "Listener C invoked before B!");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testAlwaysAsync() throws Exception {
|
void testAlwaysAsync() throws Exception {
|
||||||
final AlwaysAsyncListener listener = new AlwaysAsyncListener();
|
final AlwaysAsyncListener listener = new AlwaysAsyncListener();
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren