Example #1
0
/*
 * __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);
}
Example #2
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;
}