Fix locking in script definition provider
fixes possible parallel modifications on definitions loading, e.g. as in https://github.com/shyiko/ktlint/issues/287
This commit is contained in:
@@ -121,11 +121,18 @@ private class CachingSequence<T>(from: Sequence<T>) : Sequence<T> {
|
|||||||
|
|
||||||
private var cacheCursor = 0
|
private var cacheCursor = 0
|
||||||
|
|
||||||
override fun hasNext(): Boolean = lock.read { cacheCursor < cache.size || sequenceIterator.hasNext() }
|
override fun hasNext(): Boolean =
|
||||||
|
lock.read { cacheCursor < cache.size } || lock.write { cacheCursor < cache.size || sequenceIterator.hasNext() }
|
||||||
|
|
||||||
override fun next(): T = lock.write {
|
override fun next(): T {
|
||||||
if (cacheCursor < cache.size) cache[cacheCursor++]
|
lock.read {
|
||||||
else sequenceIterator.next().also { cache.add(it) }
|
if (cacheCursor < cache.size) return cache[cacheCursor++]
|
||||||
|
}
|
||||||
|
// lock.write is not an upgrade but retake, therefore - one more check needed
|
||||||
|
lock.write {
|
||||||
|
return if (cacheCursor < cache.size) cache[cacheCursor++]
|
||||||
|
else sequenceIterator.next().also { cache.add(it) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user