summaryrefslogtreecommitdiff
path: root/databases/db4/patches/patch-bb
diff options
context:
space:
mode:
Diffstat (limited to 'databases/db4/patches/patch-bb')
-rw-r--r--databases/db4/patches/patch-bb44
1 files changed, 44 insertions, 0 deletions
diff --git a/databases/db4/patches/patch-bb b/databases/db4/patches/patch-bb
new file mode 100644
index 00000000000..897f88ea3c4
--- /dev/null
+++ b/databases/db4/patches/patch-bb
@@ -0,0 +1,44 @@
+$NetBSD: patch-bb,v 1.3 2009/01/21 15:44:32 drochner Exp $
+
+--- lock/lock.c.orig 2009-01-16 19:58:31.000000000 +0100
++++ lock/lock.c
+@@ -1274,10 +1274,12 @@ __lock_put_internal(lt, lockp, obj_ndx,
+ SH_TAILQ_REMOVE(
+ &lt->obj_tab[obj_ndx], sh_obj, links, __db_lockobj);
+ if (sh_obj->lockobj.size > sizeof(sh_obj->objdata)) {
+- LOCK_REGION_LOCK(env);
++ if (region->part_t_size != 1)
++ LOCK_REGION_LOCK(env);
+ __env_alloc_free(&lt->reginfo,
+ SH_DBT_PTR(&sh_obj->lockobj));
+- LOCK_REGION_UNLOCK(env);
++ if (region->part_t_size != 1)
++ LOCK_REGION_UNLOCK(env);
+ }
+ SH_TAILQ_INSERT_HEAD(
+ &FREE_OBJS(lt, part_id), sh_obj, links, __db_lockobj);
+@@ -1467,15 +1469,21 @@ retry: SH_TAILQ_FOREACH(sh_obj, &lt->obj
+ if (obj->size <= sizeof(sh_obj->objdata))
+ p = sh_obj->objdata;
+ else {
+- LOCK_REGION_LOCK(env);
++ /*
++ * If we have only one partition, the region is locked.
++ */
++ if (region->part_t_size != 1)
++ LOCK_REGION_LOCK(env);
+ if ((ret =
+ __env_alloc(&lt->reginfo, obj->size, &p)) != 0) {
+ __db_errx(env,
+ "No space for lock object storage");
+- LOCK_REGION_UNLOCK(env);
++ if (region->part_t_size != 1)
++ LOCK_REGION_UNLOCK(env);
+ goto err;
+ }
+- LOCK_REGION_UNLOCK(env);
++ if (region->part_t_size != 1)
++ LOCK_REGION_UNLOCK(env);
+ }
+
+ memcpy(p, obj->data, obj->size);