Faster free bitmap search
This commit is contained in:
parent
86ad24ccdb
commit
486e8834d6
@ -5,7 +5,6 @@ import it.unimi.dsi.fastutil.ints.IntArraySet
|
|||||||
import it.unimi.dsi.fastutil.ints.IntOpenHashSet
|
import it.unimi.dsi.fastutil.ints.IntOpenHashSet
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntAVLTreeMap
|
import it.unimi.dsi.fastutil.objects.Object2IntAVLTreeMap
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList
|
import it.unimi.dsi.fastutil.objects.ObjectArrayList
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArraySet
|
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
|
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
|
||||||
import ru.dbotthepony.kommons.util.CarriedExecutor
|
import ru.dbotthepony.kommons.util.CarriedExecutor
|
||||||
import ru.dbotthepony.kommons.util.KOptional
|
import ru.dbotthepony.kommons.util.KOptional
|
||||||
@ -451,23 +450,16 @@ class BTreeDB6 private constructor(override val file: File, private var reader:
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
if (after != INVALID_BLOCK_INDEX) {
|
if (after != INVALID_BLOCK_INDEX && !occupiedBlocksBitmap[after + 1]) {
|
||||||
// if we can allocate enough blocks after specified index, allocate there (reduce fragmentation)
|
// if we can allocate enough blocks after specified index, allocate there (reduce fragmentation)
|
||||||
var correct = true
|
val findOccupied = occupiedBlocksBitmap.nextSetBit(after + 1)
|
||||||
val find = after + 1
|
val find = after + 1
|
||||||
|
|
||||||
for (i2 in 0 until size) {
|
if (findOccupied == -1 || findOccupied - find >= size) {
|
||||||
if (occupiedBlocksBitmap[i2 + find]) {
|
|
||||||
correct = false
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (correct) {
|
|
||||||
val blocks = ArrayList<Block>(size)
|
val blocks = ArrayList<Block>(size)
|
||||||
|
occupiedBlocksBitmap.set(find, find + size)
|
||||||
|
|
||||||
for (i2 in 0 until size) {
|
for (i2 in 0 until size) {
|
||||||
occupiedBlocksBitmap[i2 + find] = true
|
|
||||||
val block = Block(i2 + find)
|
val block = Block(i2 + find)
|
||||||
block.nextBlock = INVALID_BLOCK_INDEX
|
block.nextBlock = INVALID_BLOCK_INDEX
|
||||||
block.type = type
|
block.type = type
|
||||||
@ -482,29 +474,24 @@ class BTreeDB6 private constructor(override val file: File, private var reader:
|
|||||||
var i = 0
|
var i = 0
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
val find = occupiedBlocksBitmap.nextClearBit(i)
|
val findFree = occupiedBlocksBitmap.nextClearBit(i)
|
||||||
var correct = true
|
val findOccupied = occupiedBlocksBitmap.nextSetBit(findFree)
|
||||||
|
|
||||||
for (i2 in 0 until size) {
|
if (findOccupied == -1 || findOccupied - findFree >= size) {
|
||||||
if (occupiedBlocksBitmap[i2 + find]) {
|
|
||||||
correct = false
|
|
||||||
i = find + i2 + 1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (correct) {
|
|
||||||
val blocks = ArrayList<Block>(size)
|
val blocks = ArrayList<Block>(size)
|
||||||
|
|
||||||
|
occupiedBlocksBitmap.set(findFree, findFree + size)
|
||||||
|
|
||||||
for (i2 in 0 until size) {
|
for (i2 in 0 until size) {
|
||||||
occupiedBlocksBitmap[i2 + find] = true
|
val block = Block(i2 + findFree)
|
||||||
val block = Block(i2 + find)
|
|
||||||
block.nextBlock = INVALID_BLOCK_INDEX
|
block.nextBlock = INVALID_BLOCK_INDEX
|
||||||
block.type = type
|
block.type = type
|
||||||
blocks.add(block)
|
blocks.add(block)
|
||||||
}
|
}
|
||||||
|
|
||||||
return blocks
|
return blocks
|
||||||
|
} else {
|
||||||
|
i = findOccupied + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user