fixed nullpointer in disconnect of powered down computers; fixed components with a visibility lower than their reachability not being added to the list of visible components in a computer

This commit is contained in:
Florian Nücke 2013-10-30 00:50:13 +01:00
parent d886527557
commit fe446e9389

View File

@ -65,6 +65,8 @@ class Computer(val owner: Computer.Environment) extends Persistable with Runnabl
private val components = mutable.Map.empty[String, String] private val components = mutable.Map.empty[String, String]
private val addedComponents = mutable.Set.empty[Component]
private val signals = new mutable.Queue[Computer.Signal] private val signals = new mutable.Queue[Computer.Signal]
private val rom = Option(api.FileSystem. private val rom = Option(api.FileSystem.
@ -165,8 +167,7 @@ class Computer(val owner: Computer.Environment) extends Persistable with Runnabl
def addComponent(component: Component) { def addComponent(component: Component) {
if (!components.contains(component.address)) { if (!components.contains(component.address)) {
components += component.address -> component.name addedComponents += component
signal("component_added", component.address, component.name)
} }
} }
@ -175,9 +176,30 @@ class Computer(val owner: Computer.Environment) extends Persistable with Runnabl
components -= component.address components -= component.address
signal("component_removed", component.address, component.name) signal("component_removed", component.address, component.name)
} }
addedComponents -= component
}
private def processAddedComponents() {
for (component <- addedComponents) {
if (component.canBeSeenBy(owner.node)) {
components += component.address -> component.name
signal("component_added", component.address, component.name)
}
}
addedComponents.clear()
} }
def update() { def update() {
// Add components that were added since the last update to the actual list
// of components if we can see them. We use this delayed approach to avoid
// issues with components that have a visibility lower than their
// reachability, because in that case if they get connected in the wrong
// order we wouldn't add them (since they'd be invisible in their connect
// message, and only become visible with a later node-to-node connection,
// but that wouldn't trigger a connect message anymore due to the higher
// reachability).
processAddedComponents()
// Update last time run to let our executor thread know it doesn't have to // Update last time run to let our executor thread know it doesn't have to
// pause. // pause.
lastUpdate = System.currentTimeMillis lastUpdate = System.currentTimeMillis
@ -377,6 +399,8 @@ class Computer(val owner: Computer.Environment) extends Persistable with Runnabl
assert(state != Computer.State.Running) // Lock on 'this' should guarantee this. assert(state != Computer.State.Running) // Lock on 'this' should guarantee this.
assert(state != Computer.State.Stopping) // Only set while executor is running. assert(state != Computer.State.Stopping) // Only set while executor is running.
processAddedComponents()
val computerNbt = new NBTTagCompound() val computerNbt = new NBTTagCompound()
computerNbt.setInteger("state", (state match { computerNbt.setInteger("state", (state match {
@ -680,7 +704,7 @@ class Computer(val owner: Computer.Environment) extends Persistable with Runnabl
val filter = if (lua.isString(1)) Option(lua.toString(1)) else None val filter = if (lua.isString(1)) Option(lua.toString(1)) else None
lua.newTable(0, components.size) lua.newTable(0, components.size)
for ((address, name) <- components) { for ((address, name) <- components) {
if (filter.isEmpty || name.matches(filter.get)) { if (filter.isEmpty || name.contains(filter.get)) {
lua.pushString(address) lua.pushString(address)
lua.pushString(name) lua.pushString(name)
lua.rawSet(-3) lua.rawSet(-3)
@ -1076,7 +1100,7 @@ object Computer {
override def onMessage(message: Message) = { override def onMessage(message: Message) = {
message.source match { message.source match {
case component: Component if component.canBeSeenBy(node) => case component: Component =>
message.name match { message.name match {
case "system.connect" => instance.addComponent(component) case "system.connect" => instance.addComponent(component)
case "system.disconnect" => instance.removeComponent(component) case "system.disconnect" => instance.removeComponent(component)
@ -1103,8 +1127,10 @@ object Computer {
override def onDisconnect() { override def onDisconnect() {
super.onDisconnect() super.onDisconnect()
instance.rom.foreach(rom => rom.node.network.remove(rom.node)) instance.rom.foreach(rom =>
instance.tmp.foreach(tmp => tmp.node.network.remove(tmp.node)) Option(rom.node.network).foreach(_.remove(rom.node)))
instance.tmp.foreach(tmp =>
Option(tmp.node.network).foreach(_.remove(tmp.node)))
} }
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //