WEB开发网
开发学院数据库MySQL MySQL内核:innodb动态数组内部实现 阅读

MySQL内核:innodb动态数组内部实现

 2008-12-03 11:15:15 来源:WEB开发网   
核心提示: /*Closes the buffer returned by dyn_array_open. */UNIV_INLINEvoiddyn_array_close(/**/dyn_array_t*arr,/* in: dynamic array */byte*ptr)/* in: buffe

  /*************************************************************************
Closes the buffer returned by dyn_array_open. */
UNIV_INLINE
void
dyn_array_close(
/*============*/
dyn_array_t*arr,/* in: dynamic array */
byte* ptr)/* in: buffer space from ptr up was not used */
{
dyn_block_t*block;
  ut_ad(arr);
ut_ad(arr->magic_n == DYN_BLOCK_MAGIC_N);
block = dyn_array_get_last_block(arr);
  ut_ad(arr->buf_end + block->data >= ptr);
  block->used = ptr - block->data;
ut_ad(block->used <= DYN_ARRAY_DATA_SIZE);
  #ifdef UNIV_DEBUG
arr->buf_end = 0;
#endif
}

在该函数里面通过下面的一行代码进行赋值。

block->used = ptr - block->data;

其中ptr是dyn_array_open函数返回指针并使用之后的调整值。假设dyn_array_open返回的是ptr,赋值第一个长度len1的元素后,ptr得加上len1,继续len2长度的元素,ptr加上len2,以此类推。ptr指示下一个赋元组时的指针。所以通过block->used = ptr - block->data;就能够计算出偏移量,这个偏移量就是used。

看下代码的实际应用场景。

  /************************************************************
Writes 8 bytes to a file page buffered in the buffer pool.
Writes the corresponding log record to the mini-transaction log. */
void
mlog_write_dulint(
/*==============*/
byte*ptr,/* in: pointer where to write */
dulintval,/* in: value to write */
mtr_t*mtr)/* in: mini-transaction handle */
{
byte*log_ptr;
  if (ptr < buf_pool->frame_zero || ptr >= buf_pool->high_end) {
 fprintf(stderr,
"InnoDB: Error: trying to write to a stray memory location %pn", ptr);
 ut_error;
}
  ut_ad(ptr && mtr);
  mach_write_to_8(ptr, val);
  //分配空间
log_ptr = mlog_open(mtr, 11 + 2 + 9);
/* If no logging is requested, we may return now */
if (log_ptr == NULL) {
  return;
}
  log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_8BYTES,
   log_ptr, mtr);
  mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
log_ptr += 2;
log_ptr += mach_dulint_write_compressed(log_ptr, val);
  //重设used值
mlog_close(mtr, log_ptr);
}

动态数组的主要内容就是这些,还有一些关于获取长度、元素等的函数,建议参考源代码进行理解。

上一页  3 4 5 6 7 8 

Tags:MySQL 内核 innodb

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接