Commit fb8829a0 authored by Him188's avatar Him188

Add lock for TemporaryPacketHandlers

parent f9daee03
package net.mamoe.mirai.network.protocol.tim package net.mamoe.mirai.network.protocol.tim
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.io.core.* import kotlinx.io.core.*
import net.mamoe.mirai.* import net.mamoe.mirai.*
import net.mamoe.mirai.event.EventScope import net.mamoe.mirai.event.EventScope
...@@ -30,12 +32,15 @@ internal class TIMBotNetworkHandler internal constructor(private val bot: Bot) : ...@@ -30,12 +32,15 @@ internal class TIMBotNetworkHandler internal constructor(private val bot: Bot) :
override lateinit var socket: BotSocket override lateinit var socket: BotSocket
internal val temporaryPacketHandlers = mutableListOf<TemporaryPacketHandler<*>>() internal val temporaryPacketHandlers = mutableListOf<TemporaryPacketHandler<*>>()
private val handlersLock = Mutex()
private var heartbeatJob: Job? = null private var heartbeatJob: Job? = null
override suspend fun addHandler(temporaryPacketHandler: TemporaryPacketHandler<*>) { override suspend fun addHandler(temporaryPacketHandler: TemporaryPacketHandler<*>) {
temporaryPacketHandlers.add(temporaryPacketHandler) handlersLock.withLock {
temporaryPacketHandlers.add(temporaryPacketHandler)
}
temporaryPacketHandler.send(this[ActionPacketHandler].session) temporaryPacketHandler.send(this[ActionPacketHandler].session)
} }
...@@ -170,8 +175,10 @@ internal class TIMBotNetworkHandler internal constructor(private val bot: Bot) : ...@@ -170,8 +175,10 @@ internal class TIMBotNetworkHandler internal constructor(private val bot: Bot) :
packet.use { packet.use {
//coz removeIf is not inline //coz removeIf is not inline
temporaryPacketHandlers.removeIfInlined { handlersLock.withLock {
it.onPacketReceived(this@TIMBotNetworkHandler[ActionPacketHandler].session, packet) temporaryPacketHandlers.removeIfInlined {
it.onPacketReceived(this@TIMBotNetworkHandler[ActionPacketHandler].session, packet)
}
} }
val name = packet::class.simpleName val name = packet::class.simpleName
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment