--- /dev/null
+*** mp/mp_fget.c.orig 25 Sep 2003 02:15:16 -0000 11.81
+--- mp/mp_fget.c 9 Dec 2003 19:06:28 -0000 11.82
+***************
+*** 440,446 ****
+ c_mp->stat.st_pages--;
+ alloc_bhp = NULL;
+ R_UNLOCK(dbenv, &dbmp->reginfo[n_cache]);
+- MUTEX_LOCK(dbenv, &hp->hash_mutex);
+
+ /*
+ * We can't use the page we found in the pool if DB_MPOOL_NEW
+--- 440,445 ----
+***************
+*** 455,460 ****
+--- 454,462 ----
+ b_incr = 0;
+ goto alloc;
+ }
++
++ /* We can use the page -- get the bucket lock. */
++ MUTEX_LOCK(dbenv, &hp->hash_mutex);
+ break;
+ case SECOND_MISS:
+ /*
+*** mp/mp_fput.c.orig 30 Sep 2003 17:12:00 -0000 11.48
+--- mp/mp_fput.c 13 Dec 2003 00:08:29 -0000 11.49
+***************
+*** 285,290 ****
+--- 285,291 ----
+ bhp != NULL; bhp = SH_TAILQ_NEXT(bhp, hq, __bh))
+ if (bhp->priority != UINT32_T_MAX &&
+ bhp->priority > MPOOL_BASE_DECREMENT)
++ bhp->priority -= MPOOL_BASE_DECREMENT;
+ MUTEX_UNLOCK(dbenv, &hp->hash_mutex);
+ }
+ }
--- /dev/null
+*** lock/lock.c.save 2004-01-30 10:48:33.000000000 -0800
+--- lock/lock.c 2004-01-30 10:55:58.000000000 -0800
+***************
+*** 2216,2226 ****
+ dp = (u_int8_t *)dp + \
+ sizeof(db_pgno_t); \
+ } while (0)
+! #define COPY_OBJ(dp, obj) do { \
+! memcpy(dp, obj->data, obj->size); \
+! dp = (u_int8_t *)dp + \
+! ALIGN(obj->size, \
+! sizeof(u_int32_t)); \
+ } while (0)
+
+ #define GET_COUNT(dp, count) do { \
+--- 2216,2227 ----
+ dp = (u_int8_t *)dp + \
+ sizeof(db_pgno_t); \
+ } while (0)
+! #define COPY_OBJ(dp, obj) do { \
+! memcpy(dp, \
+! (obj)->data, (obj)->size); \
+! dp = (u_int8_t *)dp + \
+! ALIGN((obj)->size, \
+! sizeof(u_int32_t)); \
+ } while (0)
+
+ #define GET_COUNT(dp, count) do { \
+***************
+*** 2339,2345 ****
+ for (i = 0; i < nlocks; i = j) {
+ PUT_PCOUNT(dp, obj[i].ulen);
+ PUT_SIZE(dp, obj[i].size);
+! COPY_OBJ(dp, obj);
+ lock = (DB_LOCK_ILOCK *)obj[i].data;
+ for (j = i + 1; j <= i + obj[i].ulen; j++) {
+ lock = (DB_LOCK_ILOCK *)obj[j].data;
+--- 2340,2346 ----
+ for (i = 0; i < nlocks; i = j) {
+ PUT_PCOUNT(dp, obj[i].ulen);
+ PUT_SIZE(dp, obj[i].size);
+! COPY_OBJ(dp, &obj[i]);
+ lock = (DB_LOCK_ILOCK *)obj[i].data;
+ for (j = i + 1; j <= i + obj[i].ulen; j++) {
+ lock = (DB_LOCK_ILOCK *)obj[j].data;