Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save art-shen/2cb237497bb296e7c3a7da658734973a to your computer and use it in GitHub Desktop.

Select an option

Save art-shen/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