mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-09-10 02:34:06 +00:00
add multilocking for key-based lockers
This commit is contained in:
@@ -152,6 +152,27 @@ suspend inline fun <T, R> SmartKeyRWLocker<T>.withReadAcquire(key: T, action: ()
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
suspend inline fun <T, R> SmartKeyRWLocker<T>.withReadAcquires(keys: Iterable<T>, action: () -> R): R {
|
||||
contract {
|
||||
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
|
||||
val acquired = mutableSetOf<T>()
|
||||
try {
|
||||
keys.forEach {
|
||||
acquireRead(it)
|
||||
acquired.add(it)
|
||||
}
|
||||
return action()
|
||||
} finally {
|
||||
acquired.forEach {
|
||||
releaseRead(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
suspend inline fun <T, R> SmartKeyRWLocker<T>.withReadAcquires(vararg keys: T, action: () -> R): R = withReadAcquires(keys.asIterable(), action)
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
suspend inline fun <T, R> SmartKeyRWLocker<T>.withWriteLock(key: T, action: () -> R): R {
|
||||
contract {
|
||||
@@ -165,3 +186,23 @@ suspend inline fun <T, R> SmartKeyRWLocker<T>.withWriteLock(key: T, action: () -
|
||||
unlockWrite(key)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
suspend inline fun <T, R> SmartKeyRWLocker<T>.withWriteLocks(keys: Iterable<T>, action: () -> R): R {
|
||||
contract {
|
||||
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
|
||||
val locked = mutableSetOf<T>()
|
||||
try {
|
||||
keys.forEach {
|
||||
lockWrite(it)
|
||||
locked.add(it)
|
||||
}
|
||||
return action()
|
||||
} finally {
|
||||
locked.forEach {
|
||||
unlockWrite(it)
|
||||
}
|
||||
}
|
||||
}
|
@@ -11,7 +11,6 @@ import dev.inmo.micro_utils.repos.*
|
||||
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.*
|
||||
|
@@ -8,9 +8,6 @@ import dev.inmo.micro_utils.pagination.Pagination
|
||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||
import dev.inmo.micro_utils.repos.*
|
||||
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||
import dev.inmo.micro_utils.repos.cache.full.FullKeyValueCacheRepo
|
||||
import dev.inmo.micro_utils.repos.cache.full.FullReadKeyValueCacheRepo
|
||||
import dev.inmo.micro_utils.repos.cache.full.FullWriteKeyValueCacheRepo
|
||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
|
@@ -1,6 +1,5 @@
|
||||
package dev.inmo.micro_utils.repos.cache.full.direct
|
||||
|
||||
import dev.inmo.micro_utils.common.*
|
||||
import dev.inmo.micro_utils.coroutines.SmartRWLocker
|
||||
import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions
|
||||
import dev.inmo.micro_utils.coroutines.withReadAcquire
|
||||
|
Reference in New Issue
Block a user