diff options
-rw-r--r-- | src/api/cur_std.c | 4 | ||||
-rw-r--r-- | src/btree/bt_ovfl.c | 2 | ||||
-rw-r--r-- | src/btree/bt_reconcile.c | 2 | ||||
-rw-r--r-- | src/btree/bt_salvage.c | 2 | ||||
-rw-r--r-- | src/btree/row_key.c | 3 | ||||
-rw-r--r-- | src/include/extern.h | 4 | ||||
-rw-r--r-- | src/log/log.c | 4 | ||||
-rw-r--r-- | src/support/huffman.c | 4 | ||||
-rw-r--r-- | src/support/scratch.c | 88 |
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); } |