Commit cd6c8183 authored by Him188's avatar Him188

Reduce suspend fun calls

parent 4587f7ae
......@@ -188,36 +188,37 @@ internal object EventListenerManger {
internal suspend fun <E : Subscribable> E.broadcastInternal(): E {
if (EventDisabled) return this
suspend fun callListeners(listeners: EventListeners<in E>) {
suspend fun callAndRemoveIfRequired() = listeners.inlinedRemoveIf {
if (it.lock.tryLock()) {
try {
it.onEvent(this) == ListeningStatus.STOPPED
} finally {
it.lock.unlock()
}
} else false
}
callListeners(this::class.listeners())
applySuperListeners(this::class) { callListeners(it) }
return this
}
private suspend inline fun <E : Subscribable> E.callListeners(listeners: EventListeners<in E>) {
//自己持有, 则是在一个事件中
if (listeners.mainMutex.holdsLock(listeners)) {
callAndRemoveIfRequired()
callAndRemoveIfRequired(listeners)
} else {
while (!listeners.mainMutex.tryLock(listeners)) {
delay(10)
}
try {
callAndRemoveIfRequired()
callAndRemoveIfRequired(listeners)
} finally {
listeners.mainMutex.unlock(listeners)
}
}
}
callListeners(this::class.listeners())
}
applySuperListeners(this::class) { callListeners(it) }
return this
private suspend inline fun <E : Subscribable> E.callAndRemoveIfRequired(listeners: EventListeners<in E>) = listeners.inlinedRemoveIf {
if (it.lock.tryLock()) {
try {
it.onEvent(this) == ListeningStatus.STOPPED
} finally {
it.lock.unlock()
}
} else false
}
/**
......
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