Make waitForMultipleFutures a top-level function instead of extension

This commit is contained in:
Ilya Gorbunov
2018-11-21 18:44:58 +03:00
committed by Nikolay Igotti
parent ee42edc9a5
commit 901219ed5f
5 changed files with 15 additions and 10 deletions
@@ -29,7 +29,7 @@ fun testRandomWorkers() {
// Now collect all results into current attempt's list // Now collect all results into current attempt's list
val futureSet = futures.toSet() val futureSet = futures.toSet()
for (i in 0 until futureSet.size) { for (i in 0 until futureSet.size) {
val ready = futureSet.waitForMultipleFutures(10000) val ready = waitForMultipleFutures(futureSet, 10000)
ready.forEach { results[attempt].addAll(it.result) } ready.forEach { results[attempt].addAll(it.result) }
} }
} }
@@ -31,7 +31,7 @@ fun initJobs(count: Int) = Array<Job?>(count) { i -> Job(i, i * 2, i)}
val futureSet = futures.toSet() val futureSet = futures.toSet()
var consumed = 0 var consumed = 0
while (consumed < futureSet.size) { while (consumed < futureSet.size) {
val ready = futureSet.waitForMultipleFutures(10000) val ready = waitForMultipleFutures(futureSet, 10000)
ready.forEach { ready.forEach {
it.consume { job -> it.consume { job ->
assertEquals(job.index * 3, job.counter) assertEquals(job.index * 3, job.counter)
@@ -29,7 +29,7 @@ data class WorkerResult(val intResult: Int, val stringResult: String)
val futureSet = futures.toSet() val futureSet = futures.toSet()
var consumed = 0 var consumed = 0
while (consumed < futureSet.size) { while (consumed < futureSet.size) {
val ready = futureSet.waitForMultipleFutures(10000) val ready = waitForMultipleFutures(futureSet, 10000)
ready.forEach { ready.forEach {
it.consume { result -> it.consume { result ->
if (result.stringResult != "attempt $attempt result") throw Error("Unexpected $result") if (result.stringResult != "attempt $attempt result") throw Error("Unexpected $result")
@@ -63,28 +63,33 @@ public class Future<T> internal constructor(val id: Int) {
override public fun toString(): String = "future $id" override public fun toString(): String = "future $id"
} }
@Deprecated("Use 'waitForMultipleFutures' top-level function instead", ReplaceWith("waitForMultipleFutures(this, millis)"), DeprecationLevel.ERROR)
public fun <T> Collection<Future<T>>.waitForMultipleFutures(millis: Int): Set<Future<T>> = waitForMultipleFutures(this, millis)
/** /**
* Wait for availability of futures in the collection. Returns set with all futures which have * Wait for availability of futures in the collection. Returns set with all futures which have
* value available for the consumption, i.e. [FutureState.COMPUTED] * value available for the consumption, i.e. [FutureState.COMPUTED].
* *
* @param millis the amount of time to wait for the computed future * @param timeoutMillis the amount of time in milliseconds to wait for the computed future
*/ */
public fun <T> Collection<Future<T>>.waitForMultipleFutures(millis: Int): Set<Future<T>> { public fun <T> waitForMultipleFutures(futures: Collection<Future<T>>, timeoutMillis: Int): Set<Future<T>> {
val result = mutableSetOf<Future<T>>() val result = mutableSetOf<Future<T>>()
while (true) { while (true) {
val versionToken = versionToken() val versionToken = versionToken()
for (future in this) { for (future in futures) {
if (future.state == FutureState.COMPUTED) { if (future.state == FutureState.COMPUTED) {
result += future result += future
} }
} }
if (result.isNotEmpty()) return result if (result.isNotEmpty()) return result
if (waitForAnyFuture(versionToken, millis)) break if (waitForAnyFuture(versionToken, timeoutMillis)) break
} }
for (future in this) { for (future in futures) {
if (future.state == FutureState.COMPUTED) { if (future.state == FutureState.COMPUTED) {
result += future result += future
} }
@@ -29,7 +29,7 @@ fun main() {
val futureSet = futures.toSet() val futureSet = futures.toSet()
var consumed = 0 var consumed = 0
while (consumed < futureSet.size) { while (consumed < futureSet.size) {
val ready = futureSet.waitForMultipleFutures(10000) val ready = waitForMultipleFutures(futureSet, 10000)
ready.forEach { ready.forEach {
it.consume { result -> it.consume { result ->
if (result.stringResult != "attempt $attempt result") throw Error("Unexpected $result") if (result.stringResult != "attempt $attempt result") throw Error("Unexpected $result")