/* * __wt_buf_grow -- * Grow a buffer that's currently in-use. */ int __wt_buf_grow(WT_SESSION_IMPL *session, WT_ITEM *buf, size_t size) { size_t offset; int set_data; WT_ASSERT(session, size <= UINT32_MAX); /* Clear buffers previously used for mapped returns. */ if (F_ISSET(buf, WT_ITEM_MAPPED)) __wt_buf_clear(buf); if (size > buf->memsize) { /* * Grow the buffer's memory: if the data reference is not set * or references the buffer's memory, maintain it. */ WT_ASSERT(session, buf->mem == NULL || buf->memsize > 0); if (buf->data == NULL) { offset = 0; set_data = 1; } else if (buf->data >= buf->mem && WT_PTRDIFF(buf->data, buf->mem) < buf->memsize) { offset = WT_PTRDIFF(buf->data, buf->mem); set_data = 1; } else { offset = 0; set_data = 0; } if (F_ISSET(buf, WT_ITEM_ALIGNED)) WT_RET(__wt_realloc_aligned( session, &buf->memsize, size, &buf->mem)); else WT_RET(__wt_realloc( session, &buf->memsize, size, &buf->mem)); if (set_data) buf->data = (uint8_t *)buf->mem + offset; } return (0); }
/*尝试重分配ITEM中的mem*/ int __wt_buf_grow_worker(WT_SESSION_IMPL *session, WT_ITEM *buf, size_t size) { size_t offset; int copy_data; /*需要拷贝数据的长度*/ /*判断buf->data是否在buf->mem上,如果在,不用做数据拷贝*/ if(WT_DATA_IN_ITEM(buf)){ offset =WT_PTRDIFF(buf->data, buf->mem); copy_data = 0; } else{ offset = 0; copy_data = buf->size ? 1 : 0; } /*进行内存重分配*/ if(size > buf->memsize){ if (F_ISSET(buf, WT_ITEM_ALIGNED)) WT_RET(__wt_realloc_aligned(session, &buf->memsize, size, &buf->mem)); else WT_RET(__wt_realloc(session, &buf->memsize, size, &buf->mem)); } if(buf->data == NULL){ buf->data = buf->mem; buf->size = 0; } else{ if (copy_data) /*进行数据拷贝*/ memcpy(buf->mem, buf->data, buf->size); buf->data = (uint8_t *)buf->mem + offset; } return 0; }