uring落盘的无锁队列修改
This commit is contained in:
@@ -27,29 +27,29 @@ static inline int size_to_index(size_t size){
|
||||
|
||||
|
||||
// bitmap 操作函数
|
||||
static inline void bitmap_set(uint64_t *bitmap, uint16_t index){
|
||||
bitmap[index / 64] |= (1ULL << (index % 64));
|
||||
}
|
||||
// static inline void bitmap_set(uint64_t *bitmap, uint16_t index){
|
||||
// bitmap[index / 64] |= (1ULL << (index % 64));
|
||||
// }
|
||||
|
||||
static inline void bitmap_clear(uint64_t *bitmap, uint16_t index){
|
||||
bitmap[index / 64] &= ~(1ULL << (index % 64));
|
||||
}
|
||||
// static inline void bitmap_clear(uint64_t *bitmap, uint16_t index){
|
||||
// bitmap[index / 64] &= ~(1ULL << (index % 64));
|
||||
// }
|
||||
|
||||
static inline int bitmap_test(uint64_t *bitmap, uint16_t index){
|
||||
return (bitmap[index / 64] & (1ULL << (index % 64))) != 0;
|
||||
}
|
||||
// static inline int bitmap_test(uint64_t *bitmap, uint16_t index){
|
||||
// return (bitmap[index / 64] & (1ULL << (index % 64))) != 0;
|
||||
// }
|
||||
|
||||
static inline void bitmap_clear_all(uint64_t *bitmap, size_t size){
|
||||
memset(bitmap, 0, size * sizeof(uint64_t));
|
||||
}
|
||||
// static inline void bitmap_clear_all(uint64_t *bitmap, size_t size){
|
||||
// memset(bitmap, 0, size * sizeof(uint64_t));
|
||||
// }
|
||||
|
||||
// 根据指针计算在页中的块索引
|
||||
static inline uint16_t ptr_to_block_index(mp_page_t *pg, void *ptr){
|
||||
char *base = (char*)page_payload(pg);
|
||||
char *p = (char*)ptr;
|
||||
size_t offset = p - base;
|
||||
return (uint16_t)(offset / pg->owner->block_size);
|
||||
}
|
||||
// // 根据指针计算在页中的块索引
|
||||
// static inline uint16_t ptr_to_block_index(mp_page_t *pg, void *ptr){
|
||||
// char *base = (char*)page_payload(pg);
|
||||
// char *p = (char*)ptr;
|
||||
// size_t offset = p - base;
|
||||
// return (uint16_t)(offset / pg->owner->block_size);
|
||||
// }
|
||||
|
||||
|
||||
static mp_page_t* mp_page_create(mp_bucket_t *owner){
|
||||
@@ -74,7 +74,7 @@ static mp_page_t* mp_page_create(mp_bucket_t *owner){
|
||||
pg->prev = NULL;
|
||||
pg->next = NULL;
|
||||
|
||||
bitmap_clear_all(pg->bitmap, 16);
|
||||
// bitmap_clear_all(pg->bitmap, 16);
|
||||
|
||||
char *p = (char*)page_payload(pg);
|
||||
for(uint16_t i = 0;i < cap - 1; ++ i){
|
||||
@@ -95,8 +95,8 @@ static void *mp_page_alloc(mp_page_t *pg){
|
||||
pg->free_count --;
|
||||
|
||||
// 标记该块为已分配
|
||||
uint16_t index = ptr_to_block_index(pg, ret);
|
||||
bitmap_set(pg->bitmap, index);
|
||||
// uint16_t index = ptr_to_block_index(pg, ret);
|
||||
// bitmap_set(pg->bitmap, index);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -105,14 +105,14 @@ static int mp_page_free(mp_page_t *pg, void *ptr){
|
||||
if(!pg || !ptr) return MEMPOOL_INVALID_INPUT;
|
||||
|
||||
// 检查是否是 double free
|
||||
uint16_t index = ptr_to_block_index(pg, ptr);
|
||||
if(!bitmap_test(pg->bitmap, index)){
|
||||
// 该块未被分配,可能是 double free
|
||||
return MEMPOOL_DOUBLE_FREE;
|
||||
}
|
||||
// uint16_t index = ptr_to_block_index(pg, ptr);
|
||||
// if(!bitmap_test(pg->bitmap, index)){
|
||||
// // 该块未被分配,可能是 double free
|
||||
// return MEMPOOL_DOUBLE_FREE;
|
||||
// }
|
||||
|
||||
// 标记该块为空闲
|
||||
bitmap_clear(pg->bitmap, index);
|
||||
// bitmap_clear(pg->bitmap, index);
|
||||
|
||||
*(void**)ptr = pg->free_list;
|
||||
pg->free_list = ptr;
|
||||
|
||||
Reference in New Issue
Block a user