Fix continuous free count
This commit is contained in:
parent
c4786a62e6
commit
55a912b621
@ -516,29 +516,27 @@ size_t alloc_count_continuous(void* pool) {
|
|||||||
(void) pool;
|
(void) pool;
|
||||||
|
|
||||||
size_t largest_block = 0;
|
size_t largest_block = 0;
|
||||||
size_t current_block = 0;
|
|
||||||
|
|
||||||
|
size_t free_bits = 0;
|
||||||
for(size_t i = 0; i < pool_header.block_count; ++i) {
|
for(size_t i = 0; i < pool_header.block_count; ++i) {
|
||||||
uint8_t t = pool_header.block_usage[i];
|
uint8_t t = pool_header.block_usage[i];
|
||||||
|
|
||||||
if(!t) {
|
for(int i = 7; i >= 0; --i) {
|
||||||
current_block += 2048;
|
bool bitset = (t & (1 << i));
|
||||||
} else {
|
if(!bitset) {
|
||||||
for(int i = 7; i >= 0; --i) {
|
++free_bits;
|
||||||
bool bitset = (t & (1 << i));
|
} else {
|
||||||
if(bitset) {
|
free_bits = 0;
|
||||||
current_block += (7 - i) * 256;
|
size_t free_size = free_bits * 256;
|
||||||
if(largest_block < current_block) {
|
if(free_size > largest_block) {
|
||||||
largest_block = current_block;
|
largest_block = free_size;
|
||||||
current_block = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(largest_block < current_block) {
|
if(free_bits && (free_bits * 256) > largest_block) {
|
||||||
largest_block = current_block;
|
largest_block = (free_bits * 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
return largest_block;
|
return largest_block;
|
||||||
|
@ -39,6 +39,42 @@ public:
|
|||||||
self->defrag_moves.push_back(std::make_pair(src, dst));
|
self->defrag_moves.push_back(std::make_pair(src, dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_count_free() {
|
||||||
|
alloc_init(pool, POOL_SIZE);
|
||||||
|
|
||||||
|
assert_equal(alloc_count_free(pool), POOL_SIZE);
|
||||||
|
|
||||||
|
void* a1 = alloc_malloc(pool, 2048);
|
||||||
|
assert_equal(alloc_count_free(pool), POOL_SIZE - 2048);
|
||||||
|
|
||||||
|
void* a2 = alloc_malloc(pool, 2048);
|
||||||
|
assert_equal(alloc_count_free(pool), POOL_SIZE - 4096);
|
||||||
|
|
||||||
|
alloc_free(pool, a1);
|
||||||
|
assert_equal(alloc_count_free(pool), POOL_SIZE - 2048);
|
||||||
|
|
||||||
|
alloc_free(pool, a2);
|
||||||
|
assert_equal(alloc_count_free(pool), POOL_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_count_contiguous() {
|
||||||
|
alloc_init(pool, POOL_SIZE);
|
||||||
|
|
||||||
|
assert_equal(alloc_count_continuous(pool), POOL_SIZE);
|
||||||
|
|
||||||
|
void* a1 = alloc_malloc(pool, 2048);
|
||||||
|
assert_equal(alloc_count_continuous(pool), POOL_SIZE - 2048);
|
||||||
|
|
||||||
|
void* a2 = alloc_malloc(pool, 2048);
|
||||||
|
assert_equal(alloc_count_continuous(pool), POOL_SIZE - 4096);
|
||||||
|
|
||||||
|
alloc_free(pool, a1);
|
||||||
|
assert_equal(alloc_count_continuous(pool), POOL_SIZE - 4096);
|
||||||
|
|
||||||
|
alloc_free(pool, a2);
|
||||||
|
assert_equal(alloc_count_continuous(pool), POOL_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
void test_defrag() {
|
void test_defrag() {
|
||||||
alloc_init(pool, POOL_SIZE);
|
alloc_init(pool, POOL_SIZE);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user