VM: move free_list_allocator<Block>::next_allocated_block_after to
tenured_space::next_allocated_object_after, because it's only used theredb4
parent
f1ca83524a
commit
a0e7bb8770
|
@ -18,7 +18,6 @@ template <typename Block> struct free_list_allocator {
|
||||||
free_list_allocator(cell size, cell start);
|
free_list_allocator(cell size, cell start);
|
||||||
void initial_free_list(cell occupied);
|
void initial_free_list(cell occupied);
|
||||||
bool contains_p(Block* block);
|
bool contains_p(Block* block);
|
||||||
Block* next_allocated_block_after(Block* block);
|
|
||||||
bool can_allot_p(cell size);
|
bool can_allot_p(cell size);
|
||||||
Block* allot(cell size);
|
Block* allot(cell size);
|
||||||
void free(Block* block);
|
void free(Block* block);
|
||||||
|
@ -55,19 +54,6 @@ bool free_list_allocator<Block>::contains_p(Block* block) {
|
||||||
return ((cell)block - start) < size;
|
return ((cell)block - start) < size;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Block>
|
|
||||||
Block* free_list_allocator<Block>::next_allocated_block_after(Block* block) {
|
|
||||||
while ((cell)block != this->end && block->free_p()) {
|
|
||||||
free_heap_block* free_block = (free_heap_block*)block;
|
|
||||||
block = (Block*)((cell)free_block + free_block->size());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cell)block == this->end)
|
|
||||||
return NULL;
|
|
||||||
else
|
|
||||||
return block;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Block>
|
template <typename Block>
|
||||||
bool free_list_allocator<Block>::can_allot_p(cell size) {
|
bool free_list_allocator<Block>::can_allot_p(cell size) {
|
||||||
return free_blocks.can_allot_p(size);
|
return free_blocks.can_allot_p(size);
|
||||||
|
@ -155,7 +141,7 @@ template <typename Block, typename Iterator> struct heap_compactor {
|
||||||
|
|
||||||
void operator()(Block* block, cell size) {
|
void operator()(Block* block, cell size) {
|
||||||
if (this->state->marked_p((cell)block)) {
|
if (this->state->marked_p((cell)block)) {
|
||||||
*finger = (Block*)((char*)block + size);
|
*finger = (Block*)((cell)block + size);
|
||||||
memmove((Block*)address, block, size);
|
memmove((Block*)address, block, size);
|
||||||
iter(block, (Block*)address, size);
|
iter(block, (Block*)address, size);
|
||||||
address += size;
|
address += size;
|
||||||
|
@ -182,15 +168,12 @@ void free_list_allocator<Block>::compact(Iterator& iter, Fixup fixup,
|
||||||
template <typename Block>
|
template <typename Block>
|
||||||
template <typename Iterator, typename Fixup>
|
template <typename Iterator, typename Fixup>
|
||||||
void free_list_allocator<Block>::iterate(Iterator& iter, Fixup fixup) {
|
void free_list_allocator<Block>::iterate(Iterator& iter, Fixup fixup) {
|
||||||
Block* scan = (Block*)this->start;
|
cell scan = this->start;
|
||||||
Block* end = (Block*)this->end;
|
while (scan != this->end) {
|
||||||
|
cell size = fixup.size((Block*)scan);
|
||||||
while (scan != end) {
|
if (!((Block*)scan)->free_p())
|
||||||
cell size = fixup.size(scan);
|
iter((Block*)scan, size);
|
||||||
Block* next = (Block*)((cell)scan + size);
|
scan += size;
|
||||||
if (!scan->free_p())
|
|
||||||
iter(scan, size);
|
|
||||||
scan = next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,14 +15,21 @@ struct tenured_space : free_list_allocator<object> {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cell next_allocated_object_after(cell scan) {
|
||||||
|
while (scan != this->end && ((object*)scan)->free_p()) {
|
||||||
|
free_heap_block* free_block = (free_heap_block*)scan;
|
||||||
|
scan = (cell)free_block + free_block->size();
|
||||||
|
}
|
||||||
|
return scan == this->end ? 0 : scan;
|
||||||
|
}
|
||||||
|
|
||||||
cell first_object() {
|
cell first_object() {
|
||||||
return (cell)next_allocated_block_after((object*)this->start);
|
return next_allocated_object_after(this->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell next_object_after(cell scan) {
|
cell next_object_after(cell scan) {
|
||||||
cell size = ((object*)scan)->size();
|
cell size = ((object*)scan)->size();
|
||||||
object* next = (object*)(scan + size);
|
return next_allocated_object_after(scan + size);
|
||||||
return (cell)next_allocated_block_after(next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sweep() {
|
void sweep() {
|
||||||
|
|
Loading…
Reference in New Issue