Better server ping concurrency

Addresses #2289
This commit is contained in:
Dan Mulloy 2023-04-03 22:55:32 -04:00
parent b51812655a
commit c7753a9d5b
No known key found for this signature in database
GPG Key ID: F379C293F178751F
1 changed files with 22 additions and 13 deletions

View File

@ -3,6 +3,7 @@ package com.comphenix.protocol.wrappers.ping;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.Semaphore;
import com.comphenix.protocol.events.InternalStructure; import com.comphenix.protocol.events.InternalStructure;
import com.comphenix.protocol.reflect.EquivalentConverter; import com.comphenix.protocol.reflect.EquivalentConverter;
@ -29,30 +30,38 @@ public final class ServerPingRecord implements ServerPingImpl {
private static EquivalentConverter<List<WrappedGameProfile>> PROFILE_LIST_CONVERTER; private static EquivalentConverter<List<WrappedGameProfile>> PROFILE_LIST_CONVERTER;
private static boolean initialized = false; private static boolean initialized = false;
private static final Object lock = new Object();
private static void initialize() { private static void initialize() {
if (initialized) { if (initialized) {
return; return;
} }
initialized = true; synchronized (lock) {
// may have been initialized while waiting for the lock
if (initialized) {
return;
}
try { try {
SERVER_PING = MinecraftReflection.getServerPingClass(); SERVER_PING = MinecraftReflection.getServerPingClass();
PLAYER_SAMPLE_CLASS = MinecraftReflection.getServerPingPlayerSampleClass(); PLAYER_SAMPLE_CLASS = MinecraftReflection.getServerPingPlayerSampleClass();
SERVER_DATA_CLASS = MinecraftReflection.getServerPingServerDataClass(); SERVER_DATA_CLASS = MinecraftReflection.getServerPingServerDataClass();
PING_CTOR = Accessors.getConstructorAccessor(SERVER_PING.getConstructors()[0]); PING_CTOR = Accessors.getConstructorAccessor(SERVER_PING.getConstructors()[0]);
DATA_WRAPPER = AutoWrapper.wrap(ServerData.class, SERVER_DATA_CLASS); DATA_WRAPPER = AutoWrapper.wrap(ServerData.class, SERVER_DATA_CLASS);
SAMPLE_WRAPPER = AutoWrapper.wrap(PlayerSample.class, PLAYER_SAMPLE_CLASS); SAMPLE_WRAPPER = AutoWrapper.wrap(PlayerSample.class, PLAYER_SAMPLE_CLASS);
FAVICON_WRAPPER = AutoWrapper.wrap(Favicon.class, MinecraftReflection.getMinecraftClass("network.protocol.status.ServerPing$a")); FAVICON_WRAPPER = AutoWrapper.wrap(Favicon.class, MinecraftReflection.getMinecraftClass("network.protocol.status.ServerPing$a"));
PROFILE_LIST_CONVERTER = BukkitConverters.getListConverter(BukkitConverters.getWrappedGameProfileConverter()); PROFILE_LIST_CONVERTER = BukkitConverters.getListConverter(BukkitConverters.getWrappedGameProfileConverter());
DEFAULT_DESCRIPTION = WrappedChatComponent.fromLegacyText("A Minecraft Server"); DEFAULT_DESCRIPTION = WrappedChatComponent.fromLegacyText("A Minecraft Server");
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); // TODO throw new RuntimeException("Failed to initialize Server Ping", ex);
} finally {
initialized = true;
}
} }
} }