uring落盘的无锁队列修改

This commit is contained in:
1iaan
2026-02-11 11:59:40 +00:00
parent c1458a6693
commit 68bb4b3f9c
16 changed files with 293 additions and 1135 deletions

View File

@@ -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;

View File

@@ -8,7 +8,7 @@
#include <pthread.h>
// #define MEMPOOL_PAGE_SIZE 4096
#define MEMPOOL_PAGE_SIZE (4096*2)
#define MEMPOOL_PAGE_SIZE (256 * 1024)
#define MEMPOOL_BLOCK_MAX_SIZE 512
#define MEMPOOL_ALIGNMENT 8
#define MEMPOOL_NUM_CLASSES (MEMPOOL_BLOCK_MAX_SIZE / MEMPOOL_ALIGNMENT)
@@ -36,7 +36,7 @@ struct mp_page_s{
uint16_t free_count;
uint16_t capacity;
uint64_t bitmap[16]; // 最多支持 512/1280 个块 (64*20)
// uint64_t bitmap[16];
};
struct mp_bucket_s{