annotations for j.u.c.locks + related fixes of tests
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user