MySQL内核:innodb动态数组内部实现
2008-12-03 11:15:15 来源:WEB开发网好,我们下面先看下分配空间的函数。
/*************************************************************************
Makes room on top of a dyn array and returns a pointer to the added element.
The caller must copy the element to the pointer returned. */
UNIV_INLINE
void*
dyn_array_push(
/*===========*/
/* out: pointer to the element */
dyn_array_t*arr,/* in: dynamic array */
ulint size)/* in: size in bytes of the element */
{
dyn_block_t*block;
ulint used;
ut_ad(arr);
ut_ad(arr->magic_n == DYN_BLOCK_MAGIC_N);
ut_ad(size <= DYN_ARRAY_DATA_SIZE);
ut_ad(size);
block = arr;
used = block->used;
if (used + size > DYN_ARRAY_DATA_SIZE) {
/* Get the last array block */
block = dyn_array_get_last_block(arr);
used = block->used;
if (used + size > DYN_ARRAY_DATA_SIZE) {
block = dyn_array_add_block(arr);
used = block->used;
}
}
block->used = used + size;
ut_ad(block->used <= DYN_ARRAY_DATA_SIZE);
return((block->data) + used);
}
在这里面,我们要关注一下:
block=arr;
used=block->used;
首先得到arr的首节点,在前面的内容中,我们描述过,在只有一个节点的时候(参考图1),arr本身就是block,如果是多个节点,这个代码相当于获得的是链表的首节点。
更多精彩
赞助商链接