summaryrefslogtreecommitdiff
path: root/databases/db4/patches/patch-bb
blob: 897f88ea3c4c7a3e73e82112052302245368ad07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);