annotations for j.u.c.locks + related fixes of tests

This commit is contained in:
Alex Tkachman
2012-09-26 18:52:46 +02:00
parent 7ed2126ebb
commit e2d514907a
3 changed files with 46 additions and 5 deletions
@@ -3,7 +3,7 @@ package kt1189
import java.util.concurrent.locks.ReentrantReadWriteLock
inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
val rl = readLock()!!
val rl = readLock()
var readCount = 0
val writeCount = getWriteHoldCount()
if(writeCount == 0) {
@@ -13,7 +13,7 @@ inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
rl.unlock()
}
val wl = writeLock()!!
val wl = writeLock()
wl.lock()
try {
return action()
@@ -0,0 +1,29 @@
<root>
<item name='java.util.concurrent.locks.ReentrantReadWriteLock java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock writeLock()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.ReadWriteLock java.util.concurrent.locks.Lock readLock()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.ReadWriteLock java.util.concurrent.locks.Lock writeLock()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.ReentrantReadWriteLock java.lang.Thread getOwner()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.Lock java.util.concurrent.locks.Condition newCondition()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.Condition boolean await(long, java.util.concurrent.TimeUnit) 1'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.ReentrantLock java.util.concurrent.locks.Condition newCondition()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.ReentrantLock java.lang.Thread getOwner()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='java.util.concurrent.locks.ReentrantReadWriteLock java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock readLock()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -4,6 +4,7 @@ import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReadWriteLock
import java.util.concurrent.locks.ReentrantReadWriteLock
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
import java.util.concurrent.CountDownLatch
/**
Executes given calculation under lock
@@ -24,7 +25,7 @@ Executes given calculation under read lock
Returns result of the calculation
*/
public inline fun <T> ReentrantReadWriteLock.read(action: ()->T) : T {
val rl = readLock()!!
val rl = readLock()
rl.lock()
try {
return action()
@@ -41,12 +42,12 @@ If such write has been initiated by checking some condition, the condition must
Returns result of the calculation
*/
public inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
val rl = readLock()!!
val rl = readLock()
val readCount = if (getWriteHoldCount() == 0) getReadHoldCount() else 0
readCount times { rl.unlock() }
val wl = writeLock()!!
val wl = writeLock()
wl.lock()
try {
return action()
@@ -56,3 +57,14 @@ public inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
wl.unlock()
}
}
/**
Execute given calculation and await for CountDownLatch
Returns result of the calculation
*/
fun <T> Int.latch(op: CountDownLatch.() -> T) : T {
val cdl = CountDownLatch(this)
val res = cdl.op()
cdl.await()
return res
}