Forbid suspension points in critical sections

#KT-26480: Fixed
This commit is contained in:
Ilmir Usmanov
2018-09-11 21:29:36 +03:00
parent a4b2e5964a
commit 2dd5b8fa70
11 changed files with 186 additions and 3 deletions
@@ -0,0 +1,17 @@
val lock = Any()
inline fun inlineMe(c: () -> Unit) {
synchronized(lock) {
c()
}
}
inline fun monitorInFinally(a: () -> Unit, b: () -> Unit) {
try {
a()
} finally {
synchronized(lock) {
b()
}
}
}
@@ -0,0 +1,10 @@
compiler/testData/compileKotlinAgainstCustomBinaries/suspensionPointInMonitor/source.kt:10:13: error: the 'suspensionPoint' suspension point is inside a critical section
suspensionPoint()
^
compiler/testData/compileKotlinAgainstCustomBinaries/suspensionPointInMonitor/source.kt:14:13: error: the 'suspensionPoint' suspension point is inside a critical section
suspensionPoint()
^
compiler/testData/compileKotlinAgainstCustomBinaries/suspensionPointInMonitor/source.kt:19:15: error: the 'suspensionPoint' suspension point is inside a critical section
{ suspensionPoint() }
^
COMPILATION_ERROR
@@ -0,0 +1,22 @@
fun builder(c: suspend () -> Unit) {}
private val lock = Any()
suspend fun suspensionPoint() {}
fun test() {
builder {
synchronized(lock) {
suspensionPoint()
}
inlineMe {
suspensionPoint()
}
monitorInFinally(
{ suspensionPoint() },
{ suspensionPoint() }
)
}
}