summaryrefslogtreecommitdiff
path: root/lib/libc/db
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2009-03-28 06:38:31 +0000
committerXin LI <delphij@FreeBSD.org>2009-03-28 06:38:31 +0000
commit89bc741f779aa929cb99042a45060a9885c2003f (patch)
tree24e190980bd4567b85a3c32895463bdf393d0e53 /lib/libc/db
parent213bceeead5a8f36730239292924679020472a4d (diff)
Notes
Diffstat (limited to 'lib/libc/db')
-rw-r--r--lib/libc/db/hash/hash_buf.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/libc/db/hash/hash_buf.c b/lib/libc/db/hash/hash_buf.c
index 8741ea5f0e42..6d26b167055b 100644
--- a/lib/libc/db/hash/hash_buf.c
+++ b/lib/libc/db/hash/hash_buf.c
@@ -164,11 +164,31 @@ newbuf(HTAB *hashp, u_int32_t addr, BUFHEAD *prev_bp)
oaddr = 0;
bp = LRU;
+
+ /* It is bad to overwrite the page under the cursor. */
+ if (bp == hashp->cpage) {
+ BUF_REMOVE(bp);
+ MRU_INSERT(bp);
+ bp = LRU;
+ }
+
+ /* If prev_bp is part of bp overflow, create a new buffer. */
+ if (hashp->nbufs == 0 && prev_bp && bp->ovfl) {
+ BUFHEAD *ovfl;
+
+ for (ovfl = bp->ovfl; ovfl ; ovfl = ovfl->ovfl) {
+ if (ovfl == prev_bp) {
+ hashp->nbufs++;
+ break;
+ }
+ }
+ }
+
/*
* If LRU buffer is pinned, the buffer pool is too small. We need to
* allocate more buffers.
*/
- if (hashp->nbufs || (bp->flags & BUF_PIN)) {
+ if (hashp->nbufs || (bp->flags & BUF_PIN) || bp == hashp->cpage) {
/* Allocate a new one */
if ((bp = (BUFHEAD *)calloc(1, sizeof(BUFHEAD))) == NULL)
return (NULL);