diff --git a/core/src/main/groovy/com/muwire/core/download/Pieces.groovy b/core/src/main/groovy/com/muwire/core/download/Pieces.groovy index 4028a6f7..1bcac9f3 100644 --- a/core/src/main/groovy/com/muwire/core/download/Pieces.groovy +++ b/core/src/main/groovy/com/muwire/core/download/Pieces.groovy @@ -38,6 +38,18 @@ class Pieces { } } + synchronized int claim(Set available) { + for (int i = claimed.nextSetBit(0); i >= 0; i = claimed.nextSetBit(i+1)) + available.remove(i) + if (available.isEmpty()) + return -1 + List toList = available.toList() + Collections.shuffle(toList) + int rv = toList[0] + claimed.set(rv) + rv + } + synchronized def getDownloaded() { def rv = [] for (int i = done.nextSetBit(0); i >= 0; i = done.nextSetBit(i+1)) { diff --git a/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy b/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy index 09082103..8fa7bfd4 100644 --- a/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy +++ b/core/src/test/groovy/com/muwire/core/download/PiecesTest.groovy @@ -34,4 +34,19 @@ class PiecesTest { pieces.markDownloaded(piece2) assert pieces.isComplete() } + + @Test + public void testClaimAvailable() { + pieces = new Pieces(2) + int claimed = pieces.claim([0].toSet()) + assert claimed == 0 + assert -1 == pieces.claim([0].toSet()) + } + + @Test + public void testClaimNoneAvailable() { + pieces = new Pieces(20) + int claimed = pieces.claim() + assert -1 == pieces.claim([claimed].toSet()) + } }