KT-4825 Implement "synchronized" properly via monitorenter/monitorexit

#KT-4825 Fixed
This commit is contained in:
Andrey Breslav
2014-07-02 21:25:32 +04:00
parent c0fc5cfb53
commit 90690e0711
11 changed files with 170 additions and 16 deletions
@@ -0,0 +1,25 @@
fun box(): String {
val obj = "" as java.lang.Object
try {
synchronized (obj) {
throw Throwable()
}
}
catch (e: Throwable) {
// If monitorexit didn't happen (a finally block failed), this assertion would fail
assertThatThreadDoesNotOwnMonitor(obj)
}
return "OK"
}
fun assertThatThreadDoesNotOwnMonitor(obj: java.lang.Object) {
try {
obj.wait(1)
throw IllegalStateException("Not owning a monitor!")
}
catch (e: IllegalMonitorStateException) {
// OK
}
}
@@ -0,0 +1,13 @@
fun box(): String {
val obj = "" as java.lang.Object
val obj2 = "1" as java.lang.Object
synchronized (obj) {
synchronized (obj2) {
obj.wait(1)
obj2.wait(1)
}
}
return "OK"
}
@@ -0,0 +1,11 @@
fun box(): String {
val obj = "" as java.lang.Object
synchronized (obj) {
synchronized (obj) {
obj.wait(1)
}
}
return "OK"
}
@@ -0,0 +1,33 @@
import java.util.concurrent.*
import java.util.concurrent.atomic.*
fun thread(block: ()->Unit ) {
val thread = object: Thread() {
override fun run() {
block()
}
}
thread.start()
}
fun box() : String {
val mtref = AtomicInteger()
val cdl = CountDownLatch(11)
for(i in 0..10) {
thread {
var current = 0
do {
current = synchronized(mtref) {
val v = mtref.get() + 1
if(v < 100)
mtref.set(v+1)
v
}
}
while(current < 100)
cdl.countDown()
}
}
cdl.await()
return if(mtref.get() == 100) "OK" else mtref.get().toString()
}
@@ -0,0 +1,16 @@
fun box(): String {
val obj = "" as java.lang.Object
try {
obj.wait(1)
return "Fail: exception should have been thrown"
}
catch (e: IllegalMonitorStateException) {
// OK
}
synchronized (obj) {
obj.wait(1)
}
return "OK"
}