Avoiding potential race condition in tablets. I think.

This commit is contained in:
Florian Nücke 2014-08-27 17:37:46 +02:00
parent 7464e38302
commit 82ec88fadb

View File

@ -231,7 +231,9 @@ object Tablet extends Callable[TabletWrapper] with RemovalListener[String, Table
private var currentHolder: Entity = _
def get(stack: ItemStack, holder: Entity) = (if (holder.worldObj.isRemote) clientCache else serverCache).synchronized {
def get(stack: ItemStack, holder: Entity) = {
val cache = if (holder.worldObj.isRemote) clientCache else serverCache
cache.synchronized {
currentStack = stack
currentHolder = holder
if (!stack.hasTagCompound) {
@ -241,15 +243,12 @@ object Tablet extends Callable[TabletWrapper] with RemovalListener[String, Table
stack.getTagCompound.setString(Settings.namespace + "tablet", UUID.randomUUID().toString)
}
val id = stack.getTagCompound.getString(Settings.namespace + "tablet")
val wrapper =
if (holder.worldObj.isRemote)
clientCache.get(id, this)
else
serverCache.get(id, this)
val wrapper = cache.get(id, this)
wrapper.stack = stack
wrapper.holder = holder
wrapper
}
}
def call = {
new TabletWrapper(currentStack, currentHolder)
@ -267,19 +266,23 @@ object Tablet extends Callable[TabletWrapper] with RemovalListener[String, Table
@ForgeSubscribe
def onWorldUnload(e: WorldEvent.Unload) {
clientCache.synchronized {
clientCache.invalidateAll()
clientCache.cleanUp()
}
serverCache.synchronized {
serverCache.invalidateAll()
serverCache.cleanUp()
}
}
override def getLabel = "OpenComputers Tablet Cleanup Ticker"
override def ticks = util.EnumSet.of(TickType.CLIENT, TickType.SERVER)
override def tickStart(tickType: util.EnumSet[TickType], tickData: AnyRef*) {
clientCache.cleanUp()
serverCache.cleanUp()
clientCache.synchronized(clientCache.cleanUp())
serverCache.synchronized(serverCache.cleanUp())
}
override def tickEnd(tickType: util.EnumSet[TickType], tickData: AnyRef*) {}