Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save amal/2cb237497bb296e7c3a7da658734973a to your computer and use it in GitHub Desktop.
Save amal/2cb237497bb296e7c3a7da658734973a to your computer and use it in GitHub Desktop.
Reentrance checking coroutine Mutex
// https://github.com/Kotlin/kotlinx.coroutines/issues/3626#issuecomment-1451115356
// https://github.com/Kotlin/kotlinx.coroutines/issues/3626#issuecomment-1452820863
suspend fun <ReturnT> Mutex.checkedWithLock(
block: suspend () -> ReturnT
): ReturnT {
val element = LockedMutexesElement(this).key
check (currentCoroutineContext()[element] == null) {
"Reentered Mutex"
}
return withContext(element) { withLock { block() } }
}
private data class LockedMutexesElement(val mutex: Mutex) :
CoroutineContext.Element, CoroutineContext.Key<LockedMutexesElement> {
override val key = this
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment