Skip to content

Instantly share code, notes, and snippets.

@yorickhenning
Last active March 19, 2023 21:16
Show Gist options
  • Save yorickhenning/3275ea38e1619a5c8aa0efac9370484d to your computer and use it in GitHub Desktop.
Save yorickhenning/3275ea38e1619a5c8aa0efac9370484d to your computer and use it in GitHub Desktop.
Reentrance checking coroutine Mutex
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