Archiviert
13
0

Attempting to correct a memory leak in ticket #189.

Dieser Commit ist enthalten in:
Kristian S. Stangeland 2014-01-13 03:46:06 +01:00
Ursprung e23129540c
Commit 0c718f9484
4 geänderte Dateien mit 11 neuen und 10 gelöschten Zeilen

Datei anzeigen

@ -921,8 +921,9 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
* @param players - list of players to uninject.
*/
public void uninitializePlayers(Player[] players) {
for (Player player : players)
for (Player player : players) {
playerInjection.uninjectPlayer(player);
}
}
/**

Datei anzeigen

@ -14,7 +14,6 @@ import com.comphenix.protocol.reflect.FuzzyReflection;
import com.comphenix.protocol.utility.MinecraftFields;
import com.comphenix.protocol.utility.MinecraftReflection;
import com.google.common.collect.MapMaker;
import com.google.common.collect.Maps;
/**
* Represents an injector factory.
@ -23,11 +22,12 @@ import com.google.common.collect.Maps;
* @author Kristian
*/
class InjectionFactory {
private final ConcurrentMap<Player, Injector> playerLookup = Maps.newConcurrentMap();
// This should work as long as the injectors are, uh, injected
private final ConcurrentMap<Player, Injector> playerLookup = new MapMaker().weakKeys().weakValues().makeMap();
private final ConcurrentMap<String, Injector> nameLookup = new MapMaker().weakValues().makeMap();
// Whether or not the factory is closed
private boolean closed;
private volatile boolean closed;
/**
* Construct or retrieve a channel injector from an existing Bukkit player.
@ -44,7 +44,7 @@ class InjectionFactory {
// Find a temporary injector as well
if (injector == null)
injector = getTemporaryInjector(player);
if (injector != null)
if (injector != null && !injector.isClosed())
return injector;
Object networkManager = MinecraftFields.getNetworkManager(player);

Datei anzeigen

@ -328,10 +328,10 @@ public class NettyProtocolInjector implements ChannelListener {
@Override
public boolean uninjectPlayer(Player player) {
injectionFactory.fromPlayer(player, listener).close();
// Just let Netty clean this up
return true;
}
@Override
public void sendServerPacket(Player receiver, PacketContainer packet, NetworkMarker marker, boolean filters) throws InvocationTargetException {
injectionFactory.fromPlayer(receiver, listener).

Datei anzeigen

@ -98,12 +98,12 @@ public interface PlayerInjectionHandler {
public abstract void handleDisconnect(Player player);
/**
* Unregisters the given player.
* @param player - player to unregister.
* Uninject the given player.
* @param player - player to uninject.
* @return TRUE if a player has been uninjected, FALSE otherwise.
*/
public abstract boolean uninjectPlayer(Player player);
/**
* Unregisters a player by the given address.
* <p>