From d39ce433eda394311d9817c9f2efdde035113123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 5 Mar 2015 19:15:10 +0100 Subject: [PATCH] Might fix a memory leak. --- .../scala/li/cil/oc/common/EventHandler.scala | 21 +++++++++ .../li/cil/oc/server/component/Keyboard.scala | 43 ------------------- 2 files changed, 21 insertions(+), 43 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index d236182c8..1411e5046 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -21,6 +21,7 @@ import li.cil.oc.common.tileentity.Robot import li.cil.oc.common.tileentity.traits.power import li.cil.oc.integration.Mods import li.cil.oc.integration.util +import li.cil.oc.server.component.Keyboard import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util._ import net.minecraft.client.Minecraft @@ -34,6 +35,7 @@ import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.event.world.BlockEvent import net.minecraftforge.event.world.WorldEvent +import scala.collection.convert.WrapAsScala._ import scala.collection.mutable import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -45,10 +47,14 @@ object EventHandler { private val runningRobots = mutable.Set.empty[Robot] + private val keyboards = java.util.Collections.newSetFromMap[Keyboard](new java.util.WeakHashMap[Keyboard, java.lang.Boolean]) + def onRobotStart(robot: Robot): Unit = runningRobots += robot def onRobotStopped(robot: Robot): Unit = runningRobots -= robot + def addKeyboard(keyboard: Keyboard): Unit = keyboards += keyboard + def schedule(tileEntity: TileEntity) { if (SideTracker.isServer) pending.synchronized { pending += (() => Network.joinOrCreateNetwork(tileEntity)) @@ -186,6 +192,21 @@ object EventHandler { } } + @SubscribeEvent + def onPlayerRespawn(e: PlayerRespawnEvent) { + keyboards.foreach(_.releasePressedKeys(e.player)) + } + + @SubscribeEvent + def onPlayerChangedDimension(e: PlayerChangedDimensionEvent) { + keyboards.foreach(_.releasePressedKeys(e.player)) + } + + @SubscribeEvent + def onPlayerLogout(e: PlayerLoggedOutEvent) { + keyboards.foreach(_.releasePressedKeys(e.player)) + } + lazy val drone = api.Items.get("drone") lazy val eeprom = api.Items.get("eeprom") lazy val mcu = api.Items.get("microcontroller") diff --git a/src/main/scala/li/cil/oc/server/component/Keyboard.scala b/src/main/scala/li/cil/oc/server/component/Keyboard.scala index cc1072cc8..6aec2df26 100644 --- a/src/main/scala/li/cil/oc/server/component/Keyboard.scala +++ b/src/main/scala/li/cil/oc/server/component/Keyboard.scala @@ -1,21 +1,14 @@ package li.cil.oc.server.component -import cpw.mods.fml.common.FMLCommonHandler -import cpw.mods.fml.common.eventhandler.SubscribeEvent -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerChangedDimensionEvent -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.Network import li.cil.oc.api.component.Keyboard.UsabilityChecker import li.cil.oc.api.driver.EnvironmentHost import li.cil.oc.api.network.Message -import li.cil.oc.api.network.Node import li.cil.oc.api.network.Visibility import li.cil.oc.api.prefab import net.minecraft.entity.player.EntityPlayer -import net.minecraftforge.event.world.WorldEvent import scala.collection.mutable @@ -35,21 +28,6 @@ class Keyboard(val host: EnvironmentHost) extends prefab.ManagedEnvironment with // ----------------------------------------------------------------------- // - @SubscribeEvent - def onPlayerRespawn(e: PlayerRespawnEvent) { - releasePressedKeys(e.player) - } - - @SubscribeEvent - def onPlayerChangedDimension(e: PlayerChangedDimensionEvent) { - releasePressedKeys(e.player) - } - - @SubscribeEvent - def onPlayerLogout(e: PlayerLoggedOutEvent) { - releasePressedKeys(e.player) - } - def releasePressedKeys(player: EntityPlayer) { pressedKeys.get(player) match { case Some(keys) => for ((code, char) <- keys) { @@ -65,29 +43,8 @@ class Keyboard(val host: EnvironmentHost) extends prefab.ManagedEnvironment with pressedKeys.remove(player) } - @SubscribeEvent - def onWorldUnload(e: WorldEvent.Unload) { - try FMLCommonHandler.instance.bus.unregister(this) catch { - case ignore: Throwable => - } - } - // ----------------------------------------------------------------------- // - override def onConnect(node: Node) { - if (node == this.node) { - FMLCommonHandler.instance.bus.register(this) - } - } - - override def onDisconnect(node: Node) { - if (node == this.node) { - try FMLCommonHandler.instance.bus.unregister(this) catch { - case ignore: Throwable => - } - } - } - override def onMessage(message: Message) = { message.data match { case Array(p: EntityPlayer, char: Character, code: Integer) if message.name == "keyboard.keyDown" =>