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:
Ilya Chernikov
2018-12-11 11:19:49 +01:00
parent b143a1c8f7
commit abc13589c8
@@ -121,11 +121,18 @@ private class CachingSequence<T>(from: Sequence<T>) : Sequence<T> {
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 {
if (cacheCursor < cache.size) cache[cacheCursor++]
else sequenceIterator.next().also { cache.add(it) }
override fun next(): T {
lock.read {
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) }
}
}
}