summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/api/cur_std.c4
-rw-r--r--src/btree/bt_ovfl.c2
-rw-r--r--src/btree/bt_reconcile.c2
-rw-r--r--src/btree/bt_salvage.c2
-rw-r--r--src/btree/row_key.c3
-rw-r--r--src/include/extern.h4
-rw-r--r--src/log/log.c4
-rw-r--r--src/support/huffman.c4
-rw-r--r--src/support/scratch.c88
9 files changed, 75 insertions, 38 deletions
diff --git a/src/api/cur_std.c b/src/api/cur_std.c
index ee34cec9ce5..03424d23953 100644
--- a/src/api/cur_std.c
+++ b/src/api/cur_std.c
@@ -93,7 +93,7 @@ __cursor_set_key(WT_CURSOR *cursor, ...)
} else {
buf = &cursor->key;
sz = wiredtiger_struct_sizev(fmt, ap);
- if ((ret = __wt_buf_setsize(session, buf, sz)) == 0 &&
+ if ((ret = __wt_buf_initsize(session, buf, sz)) == 0 &&
(ret = wiredtiger_struct_packv(buf->mem, sz, fmt, ap)) == 0)
F_SET(cursor, WT_CURSTD_KEY_SET);
else {
@@ -143,7 +143,7 @@ __cursor_set_value(WT_CURSOR *cursor, ...)
} else {
buf = &cursor->value;
sz = wiredtiger_struct_sizev(fmt, ap);
- if ((ret = __wt_buf_setsize(session, buf, sz)) == 0 &&
+ if ((ret = __wt_buf_initsize(session, buf, sz)) == 0 &&
(ret = wiredtiger_struct_packv(buf->mem, sz, fmt, ap)) == 0)
F_SET(cursor, WT_CURSTD_VALUE_SET);
else {
diff --git a/src/btree/bt_ovfl.c b/src/btree/bt_ovfl.c
index 4731b2d59e4..a0b793b1c74 100644
--- a/src/btree/bt_ovfl.c
+++ b/src/btree/bt_ovfl.c
@@ -51,7 +51,7 @@ __wt_ovfl_in(SESSION *session, WT_OFF *ovfl, WT_BUF *store)
*
* Re-allocate memory as necessary to hold the overflow pages.
*/
- WT_RET(__wt_buf_setsize(session, store, ovfl->size));
+ WT_RET(__wt_buf_initsize(session, store, ovfl->size));
/* Read the page. */
WT_RET(__wt_disk_read(session, store->mem, ovfl->addr, ovfl->size));
diff --git a/src/btree/bt_reconcile.c b/src/btree/bt_reconcile.c
index fe5ea5928ae..47853309651 100644
--- a/src/btree/bt_reconcile.c
+++ b/src/btree/bt_reconcile.c
@@ -952,7 +952,7 @@ __rec_split_init(
btree = session->btree;
/* Ensure the scratch buffer is large enough. */
- WT_RET(__wt_buf_setsize(session, &r->dsk, (size_t)max));
+ WT_RET(__wt_buf_initsize(session, &r->dsk, (size_t)max));
/*
* Some fields of the disk image are fixed based on the original page,
diff --git a/src/btree/bt_salvage.c b/src/btree/bt_salvage.c
index 9ceee572b25..922024a7e81 100644
--- a/src/btree/bt_salvage.c
+++ b/src/btree/bt_salvage.c
@@ -318,7 +318,7 @@ __slvg_read(SESSION *session, WT_STUFF *ss)
goto skip_allocsize;
/* The page size isn't insane, read the entire page. */
- WT_ERR(__wt_buf_setsize(session, t, size));
+ WT_ERR(__wt_buf_initsize(session, t, size));
WT_ERR(__wt_read(session, fh, off, size, t->mem));
dsk = t->mem;
diff --git a/src/btree/row_key.c b/src/btree/row_key.c
index f1104f998dd..cab254bce0a 100644
--- a/src/btree/row_key.c
+++ b/src/btree/row_key.c
@@ -217,9 +217,8 @@ __wt_row_key(SESSION *session, WT_PAGE *page, void *row_arg, WT_BUF *retb)
*/
WT_ERR(__wt_cell_copy(session, key, &tmp));
WT_ERR(
- __wt_buf_setsize(session, retb, tmp.size + pfx));
+ __wt_buf_initsize(session, retb, tmp.size + pfx));
memcpy((uint8_t *)retb->data + pfx, tmp.data, tmp.size);
- retb->size = tmp.size + pfx;
if (slot_offset == 0)
break;
diff --git a/src/include/extern.h b/src/include/extern.h
index e1c769d87b6..6f41ece3d91 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -362,7 +362,9 @@ uint32_t __wt_nlpo2_round(uint32_t v);
uint32_t __wt_nlpo2(uint32_t v);
int __wt_ispo2(uint32_t v);
uint32_t __wt_prime(uint32_t n);
-int __wt_buf_setsize(SESSION *session, WT_BUF *buf, size_t sz);
+int __wt_buf_init(SESSION *session, WT_BUF *buf, size_t size);
+int __wt_buf_initsize(SESSION *session, WT_BUF *buf, size_t size);
+int __wt_buf_grow(SESSION *session, WT_BUF *buf, size_t size);
int __wt_buf_set(SESSION *session,
WT_BUF *buf,
const void *data,
diff --git a/src/log/log.c b/src/log/log.c
index 41cb5bc5209..2b0961994dc 100644
--- a/src/log/log.c
+++ b/src/log/log.c
@@ -31,7 +31,7 @@ __wt_log_put(SESSION *session, WT_LOGREC_DESC *recdesc, ...)
WT_ERR(__log_record_size(session, recdesc, ap, &size));
va_end(ap);
- WT_RET(__wt_buf_setsize(session, buf, size));
+ WT_RET(__wt_buf_initsize(session, buf, size));
va_start(ap, recdesc);
WT_ERR(wiredtiger_struct_packv(buf->mem, size, recdesc->fmt, ap));
@@ -59,7 +59,7 @@ __wt_log_vprintf(SESSION *session, const char *fmt, va_list ap)
len = vsnprintf(NULL, 0, fmt, ap_copy) + 2;
va_end(ap_copy);
- WT_RET(__wt_buf_setsize(session, buf, len));
+ WT_RET(__wt_buf_initsize(session, buf, len));
(void)vsnprintf(buf->mem, len, fmt, ap);
diff --git a/src/support/huffman.c b/src/support/huffman.c
index 84a0f0bade1..9678ca11e97 100644
--- a/src/support/huffman.c
+++ b/src/support/huffman.c
@@ -720,7 +720,7 @@ __wt_huffman_encode(SESSION *session, void *huffman_arg,
/* Copy result of exact known size into caller's buffer. */
outlen = (bitpos + 7) / 8;
- WT_ERR(__wt_buf_setsize(session, to_buf, outlen));
+ WT_ERR(__wt_buf_initsize(session, to_buf, outlen));
memcpy(to_buf->mem, tmp->mem, outlen);
#if 0
@@ -866,7 +866,7 @@ __wt_huffman_decode(SESSION *session, void *huffman_arg,
}
/* Return the number of bytes used. */
- WT_ERR(__wt_buf_setsize(session, to_buf, outlen));
+ WT_ERR(__wt_buf_initsize(session, to_buf, outlen));
memcpy(to_buf->mem, tmp->mem, outlen);
#if 0
diff --git a/src/support/scratch.c b/src/support/scratch.c
index 0c2bf41ce6f..63079ba1e9e 100644
--- a/src/support/scratch.c
+++ b/src/support/scratch.c
@@ -10,38 +10,78 @@
static void __wt_buf_clear(WT_BUF *);
/*
- * __wt_buf_setsize --
- * Ensure that a buffer is at least as big as required and configure it
- * to return an item, so that data == mem.
+ * __wt_buf_clear --
+ * Clear a buffer.
+ */
+static void
+__wt_buf_clear(WT_BUF *buf)
+{
+ buf->data = NULL;
+ buf->size = 0;
+
+ buf->mem = NULL;
+ buf->mem_size = 0;
+
+ /* Note: don't clear the flags, the buffer remains marked in-use. */
+}
+
+/*
+ * __wt_buf_init --
+ * Initialize a buffer at a specific size.
*/
int
-__wt_buf_setsize(SESSION *session, WT_BUF *buf, size_t sz)
+__wt_buf_init(SESSION *session, WT_BUF *buf, size_t size)
{
- WT_ASSERT(session, sz <= UINT32_MAX);
+ WT_ASSERT(session, size <= UINT32_MAX);
- if (sz > buf->mem_size)
- WT_RET(__wt_realloc(session, &buf->mem_size, sz, &buf->mem));
+ if (size > buf->mem_size)
+ WT_RET(__wt_realloc(session, &buf->mem_size, size, &buf->mem));
buf->data = buf->mem;
- buf->size = (uint32_t)sz;
+ buf->size = 0;
return (0);
}
/*
- * __wt_buf_clear --
- * Clear a buffer.
+ * __wt_buf_initsize --
+ * Initialize a buffer at a specific size, and set the data length.
*/
-static void
-__wt_buf_clear(WT_BUF *buf)
+int
+__wt_buf_initsize(SESSION *session, WT_BUF *buf, size_t size)
{
- buf->data = NULL;
- buf->size = 0;
+ WT_RET(__wt_buf_init(session, buf, size));
- buf->mem = NULL;
- buf->mem_size = 0;
+ buf->size = (uint32_t)size; /* Set the data length. */
- /* Note: don't clear the flags, the buffer remains marked in-use. */
+ return (0);
+}
+
+/*
+ * __wt_buf_grow --
+ * Grow a buffer that's currently in-use.
+ */
+int
+__wt_buf_grow(SESSION *session, WT_BUF *buf, size_t size)
+{
+ uint32_t offset;
+
+ WT_ASSERT(session, size <= UINT32_MAX);
+
+ if (size <= buf->mem_size)
+ return (0);
+
+ /*
+ * If we reallocate the buffer's memory, maintain the previous values
+ * for the data/size pair.
+ */
+ offset = buf->data == NULL ? 0 : WT_PTRDIFF32(buf->data, buf->mem);
+
+ WT_RET(__wt_realloc(session, &buf->mem_size, size, &buf->mem));
+
+ buf->data = (uint8_t *)buf->mem + offset;
+
+ return (0);
}
/*
@@ -52,15 +92,10 @@ int
__wt_buf_set(SESSION *session, WT_BUF *buf, const void *data, uint32_t size)
{
/* Ensure the buffer is large enough. */
- WT_RET(__wt_buf_setsize(session, buf, size));
+ WT_RET(__wt_buf_initsize(session, buf, size));
memcpy(buf->mem, data, size);
- /*
- * !!!
- * We don't have to set buf->data or buf->size, the __wt_buf_setsize()
- * function did that for us.
- */
return (0);
}
@@ -155,8 +190,9 @@ __wt_scr_alloc(SESSION *session, uint32_t size, WT_BUF **scratchp)
* is large enough, we're done; otherwise, remember it.
*/
if (buf->mem_size >= size) {
+ WT_ERR(__wt_buf_init(session, buf, size));
F_SET(buf, WT_BUF_INUSE);
- WT_ERR(__wt_buf_setsize(session, buf, size));
+
*scratchp = buf;
return (0);
}
@@ -169,9 +205,9 @@ __wt_scr_alloc(SESSION *session, uint32_t size, WT_BUF **scratchp)
* Try and grow it.
*/
if (small != NULL) {
- WT_ERR(__wt_buf_setsize(session, small, size));
-
+ WT_ERR(__wt_buf_init(session, small, size));
F_SET(small, WT_BUF_INUSE);
+
*scratchp = small;
return (0);
}