download pieces sequentially if over a threshold

pull/4/head
Zlatin Balevsky 2019-05-29 09:19:09 +01:00
parent 64bcb63dd9
commit 89b07ba350
1 changed files with 14 additions and 1 deletions

View File

@ -3,16 +3,29 @@ package com.muwire.core.download
class Pieces {
private final BitSet bitSet
private final int nPieces
private final float ratio
private final Random random = new Random()
Pieces(int nPieces) {
this(nPieces, 1.0f)
}
Pieces(int nPieces, float ratio) {
this.nPieces = nPieces
this.ratio = ratio
bitSet = new BitSet(nPieces)
}
synchronized int getRandomPiece() {
if (isComplete())
int cardinality = bitSet.cardinality()
if (cardinality == nPieces)
return -1
// if fuller than ratio just do sequential
if ( (1.0f * cardinality) / nPieces > ratio) {
return bitSet.nextClearBit(0)
}
while(true) {
int start = random.nextInt(nPieces)
while(bitSet.get(start) && ++start < nPieces);