From 6aba1670ec99ff19df2a7de955389002e121466a Mon Sep 17 00:00:00 2001 From: Dude so hot Date: Sat, 19 Oct 2024 20:57:34 +0800 Subject: [PATCH] Refine NamedMutex --- .../kotlin/moe/tarsin/coroutines/NamedMutex.kt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/moe/tarsin/coroutines/NamedMutex.kt b/app/src/main/kotlin/moe/tarsin/coroutines/NamedMutex.kt index aa3087106..02cd8f424 100644 --- a/app/src/main/kotlin/moe/tarsin/coroutines/NamedMutex.kt +++ b/app/src/main/kotlin/moe/tarsin/coroutines/NamedMutex.kt @@ -5,18 +5,17 @@ import io.ktor.utils.io.pool.DefaultPool import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -class MutexTracker(val mutex: Mutex = Mutex(), var count: Int = 0) { +class MutexTracker(mutex: Mutex = Mutex(), private var count: Int = 0) : Mutex by mutex { operator fun inc() = apply { count++ } operator fun dec() = apply { count-- } + val isFree + get() = count == 0 } -val MutexTracker.isFree - get() = count == 0 - class MutexPool(capacity: Int) : DefaultPool(capacity) { override fun produceInstance() = MutexTracker() override fun validateInstance(mutex: MutexTracker) { - check(!mutex.mutex.isLocked) + check(!mutex.isLocked) check(mutex.isFree) } } @@ -24,15 +23,14 @@ class MutexPool(capacity: Int) : DefaultPool(capacity) { class NamedMutex(capacity: Int) { val pool = MutexPool(capacity) val active = mutableScatterMapOf() - val lock = Any() } suspend inline fun NamedMutex.withLock(key: K, owner: Any? = null, action: () -> R): R { - val mutex = synchronized(lock) { active.getOrPut(key) { pool.borrow() }.inc() } + val mutex = synchronized(active) { active.getOrPut(key) { pool.borrow() }.inc() } return try { - mutex.mutex.withLock(owner, action) + mutex.withLock(owner, action) } finally { - synchronized(lock) { + synchronized(active) { mutex.dec() if (mutex.isFree) { active.remove(key)