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
|
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||||
|
|
||||||
inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
|
inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
|
||||||
val rl = readLock()!!
|
val rl = readLock()
|
||||||
var readCount = 0
|
var readCount = 0
|
||||||
val writeCount = getWriteHoldCount()
|
val writeCount = getWriteHoldCount()
|
||||||
if(writeCount == 0) {
|
if(writeCount == 0) {
|
||||||
@@ -13,7 +13,7 @@ inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
|
|||||||
rl.unlock()
|
rl.unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
val wl = writeLock()!!
|
val wl = writeLock()
|
||||||
wl.lock()
|
wl.lock()
|
||||||
try {
|
try {
|
||||||
return action()
|
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.ReadWriteLock
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
|
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
|
||||||
|
import java.util.concurrent.CountDownLatch
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Executes given calculation under lock
|
Executes given calculation under lock
|
||||||
@@ -24,7 +25,7 @@ Executes given calculation under read lock
|
|||||||
Returns result of the calculation
|
Returns result of the calculation
|
||||||
*/
|
*/
|
||||||
public inline fun <T> ReentrantReadWriteLock.read(action: ()->T) : T {
|
public inline fun <T> ReentrantReadWriteLock.read(action: ()->T) : T {
|
||||||
val rl = readLock()!!
|
val rl = readLock()
|
||||||
rl.lock()
|
rl.lock()
|
||||||
try {
|
try {
|
||||||
return action()
|
return action()
|
||||||
@@ -41,12 +42,12 @@ If such write has been initiated by checking some condition, the condition must
|
|||||||
Returns result of the calculation
|
Returns result of the calculation
|
||||||
*/
|
*/
|
||||||
public inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
|
public inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
|
||||||
val rl = readLock()!!
|
val rl = readLock()
|
||||||
|
|
||||||
val readCount = if (getWriteHoldCount() == 0) getReadHoldCount() else 0
|
val readCount = if (getWriteHoldCount() == 0) getReadHoldCount() else 0
|
||||||
readCount times { rl.unlock() }
|
readCount times { rl.unlock() }
|
||||||
|
|
||||||
val wl = writeLock()!!
|
val wl = writeLock()
|
||||||
wl.lock()
|
wl.lock()
|
||||||
try {
|
try {
|
||||||
return action()
|
return action()
|
||||||
@@ -56,3 +57,14 @@ public inline fun <T> ReentrantReadWriteLock.write(action: ()->T) : T {
|
|||||||
wl.unlock()
|
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