Forbid suspension points in critical sections
#KT-26480: Fixed
This commit is contained in:
+17
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
@@ -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
|
||||
+22
@@ -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() }
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user