Fixed server crash caused by HCIM death

Fixed NPEs thrown by packet write queue
Fixed rare concurrency issue with packet write queue
This commit is contained in:
Ceikry
2022-08-20 07:27:33 +00:00
committed by Ryan
parent a69253d3d2
commit e7804fdd42
2 changed files with 8 additions and 9 deletions
@@ -37,7 +37,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
open fun terminate() { open fun terminate() {
finalized = true finalized = true
pulseManager.clear("amemovement") pulseManager.clear("amemovement")
RandomEventManager.getInstance(player)!!.event = null RandomEventManager.getInstance(player)?.event = null
if (initialized) { if (initialized) {
poofClear(this) poofClear(this)
} }
@@ -16,7 +16,7 @@ class PacketWriteQueue : TickListener {
companion object { companion object {
private val queueLock = ReentrantLock() private val queueLock = ReentrantLock()
private val packetsToQueue = ArrayList<QueuedPacket<*>?>(1000) private val packetsToQueue = LinkedList<QueuedPacket<*>?>()
private val packetsToWrite = LinkedList<QueuedPacket<*>?>() private val packetsToWrite = LinkedList<QueuedPacket<*>?>()
@JvmStatic @JvmStatic
@@ -34,7 +34,7 @@ class PacketWriteQueue : TickListener {
@JvmStatic @JvmStatic
fun <T> push(packet: OutgoingPacket<T>, context: T) { fun <T> push(packet: OutgoingPacket<T>, context: T) {
if (queueLock.isLocked) if (queueLock.isHeldByCurrentThread)
packetsToQueue.add(QueuedPacket(packet, context)) packetsToQueue.add(QueuedPacket(packet, context))
else else
packetsToWrite.add(QueuedPacket(packet, context)) packetsToWrite.add(QueuedPacket(packet, context))
@@ -58,8 +58,9 @@ class PacketWriteQueue : TickListener {
SystemLogger.logWarn("Packet queue was NOT empty! Remaining packets: ${packetsToWrite.size}") SystemLogger.logWarn("Packet queue was NOT empty! Remaining packets: ${packetsToWrite.size}")
try { try {
for (pkt: QueuedPacket<*>? in packetsToWrite) SystemLogger.logWarn("${pkt?.out?.javaClass?.simpleName ?: "NULL"} <- ${pkt?.context ?: "NULL"}") for (pkt: QueuedPacket<*>? in packetsToWrite) SystemLogger.logWarn("${pkt?.out?.javaClass?.simpleName ?: "NULL"} <- ${pkt?.context ?: "NULL"}")
} catch (e: Exception) } catch (ignored: NullPointerException) {
{ //do nothing, we don't care, this can happen when everything is working as intended.
} catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} finally { } finally {
packetsToWrite.clear() packetsToWrite.clear()
@@ -68,10 +69,8 @@ class PacketWriteQueue : TickListener {
queueLock.unlock() queueLock.unlock()
val queueIter = packetsToQueue.iterator() while (packetsToQueue.isNotEmpty()) {
while (queueIter.hasNext()) { packetsToWrite.add(packetsToQueue.pop())
packetsToWrite.add(queueIter.next())
queueIter.remove()
} }
} }