mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-10-03 23:48:22 +00:00
fix bitmap allocation
This commit is contained in:
+13
-5
@@ -104,19 +104,27 @@ static uint64_t cache_mark_blocks(struct uwsgi_cache *uc, uint64_t index, uint64
|
||||
|
||||
uint64_t first_byte = index/8;
|
||||
uint8_t first_byte_bit = index % 8;
|
||||
uint64_t last_byte = (index+needed_blocks)/8;
|
||||
uint8_t last_byte_bit = (index+needed_blocks) % 8;
|
||||
// offset starts with 0, so actial last byte is index + needed_blocks - 1
|
||||
uint64_t last_byte = (index + needed_blocks - 1) / 8;
|
||||
uint8_t last_byte_bit = (index + needed_blocks - 1) % 8;
|
||||
|
||||
uint64_t needed_bytes = (last_byte - first_byte) + 1;
|
||||
|
||||
//uwsgi_log("%llu %u %llu %u\n", first_byte, first_byte_bit, last_byte, last_byte_bit);
|
||||
|
||||
uint8_t mask = 0xff >> first_byte_bit;
|
||||
|
||||
if (needed_bytes == 1) {
|
||||
// kinda hacky, but it does the job
|
||||
mask >>= (8 - last_byte_bit);
|
||||
mask <<= (8 - last_byte_bit);
|
||||
}
|
||||
|
||||
uc->blocks_bitmap[first_byte] |= mask;
|
||||
|
||||
uint64_t needed_bytes = (last_byte - first_byte)+1;
|
||||
|
||||
if (needed_bytes > 1) {
|
||||
mask = 0xff << (8 - last_byte_bit);
|
||||
uc->blocks_bitmap[last_byte-1] |= mask;
|
||||
uc->blocks_bitmap[last_byte] |= mask;
|
||||
}
|
||||
|
||||
if (needed_bytes > 2) {
|
||||
|
||||
Reference in New Issue
Block a user