A-A+

InnoDB源码解析-基础数据结构

2022年02月04日 数据库 暂无评论 阅读 823 次

互斥锁 ib_mutex_t

typedef FutexMutex ib_mutex_t;

 

UT_MUTEX_TYPE(TTASFutexMutex, GenericPolicy, FutexMutex); 这个宏定义展开是 typedef PolicyMutex<TTASFutexMutex<GenericPolicy>> FutexMutex;

 

PolicyMutex是个mutex框架,具体实现依赖模板参数MutexImpl。

TTASFutexMutex 有一个字段代表锁状态,用CAS指令实现spinlock,如果spin次数超过阈值,使用SYS_futex。

typedef int lock_word_t; lock_word_t TTASFutexMutex::m_lock_word;

 

双向链表 ut_list

源码位置:include/ut0lst.h

用于声明一个列表的宏 #define UT_LIST_BASE_NODE_T(t) ut_list_base<t, ut_list_node<t> t::*>

比如 UT_LIST_BASE_NODE_T(buf_page_t) flush_list;  展开后为
ut_list_base<buf_page_t, ut_list_node<ut_list_node> buf_page_t::*>。其中, ut_list_node<ut_list_node> buf_page_t::*是buf_page_t的成员变量指针的类型,即buf_page_t内成员偏移量的变量类型。

node字段的初始化在UT_LIST_INIT宏中,例如 UT_LIST_INIT(buf_pool->flush_list, &buf_page_t::list)中将node初始化为buf_page_t的list字段(即ut_list_node类型字段)的对象内偏移量

 

基本操作接口:

 

向量 ib_vector_t

ib_vector_t自带了一个内存分配器,默认是heap_allocator。

 

ib_alloc_t是内存分配器的抽象接口,里面定义了 申请、释放、resize三个函数指针。

 

具体的子类有heap_alloc/sync_heap/self_heap等等。

以heap_alloc为例:

 

回到ib_vector_t的相关函数。

 

工作队列 ib_wqueue_t

ib_wqueue_t 是一个支持并发访问的阻塞队列。

 

哈希表 hash_table_t

hash_table_t 哈希表,冲突串链,hash_cell_t 即桶对象。

操作接口:HASH_INSERT / HASH_DELETE / HASH_SEARCH / HASH_SEARCH_ALL / HASH_DELETE_AND_COMPACT / HASH_MIGRATE 。

HASH_INSERT(TYPE, NAME, TABLE, FOLD, DATA) 的一个具体操作例子,HASH_INSERT(buf_page_t, hash, buf_pool->page_hash, b->id.fold(), b); 参数各字段含义是:

注:看实现代码,HASH_SEARCH是先根据哈希值找到桶,然后在桶内查找。

标签:

给我留言