summary refs log tree commit diff
path: root/db2/mp/mp_region.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/mp/mp_region.c')
-rw-r--r--db2/mp/mp_region.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/db2/mp/mp_region.c b/db2/mp/mp_region.c
index 6b2f93125c..c20e669749 100644
--- a/db2/mp/mp_region.c
+++ b/db2/mp/mp_region.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mp_region.c	10.16 (Sleepycat) 10/25/97";
+static const char sccsid[] = "@(#)mp_region.c	10.18 (Sleepycat) 11/29/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -224,17 +224,28 @@ retry:	if (LF_ISSET(DB_CREATE)) {
 		 * the file descriptor for locking.  However, it should not
 		 * be possible for DB_THREAD to be set if HAVE_SPINLOCKS aren't
 		 * defined.
+		 *
+		 * XXX
+		 * HP-UX won't permit mutexes to live in anything but shared
+		 * memory.  So, instantiate the shared mpool region file on
+		 * that architecture, regardless.  If this turns out to be a
+		 * performance problem, we could use anonymous memory instead.
 		 */
-		if (F_ISSET(dbmp, MP_ISPRIVATE)) {
+#if !defined(__hppa)
+		if (F_ISSET(dbmp, MP_ISPRIVATE))
 			if ((dbmp->maddr = __db_malloc(rlen)) == NULL)
 				ret = ENOMEM;
-			else
+			else {
+				F_SET(dbmp, MP_MALLOC);
 				ret = __db_rinit(dbmp->dbenv,
 				    dbmp->maddr, 0, rlen, 0);
-		} else
+			}
+		else
+#endif
 			ret = __db_rcreate(dbmp->dbenv, DB_APP_NONE, path,
-			    DB_DEFAULT_MPOOL_FILE, mode, rlen, &fd,
-			    &dbmp->maddr);
+			    DB_DEFAULT_MPOOL_FILE, mode, rlen,
+			    F_ISSET(dbmp, MP_ISPRIVATE) ? DB_TEMPORARY : 0,
+			    &fd, &dbmp->maddr);
 		if (ret == 0) {
 			/* Put the MPOOL structure first in the region. */
 			mp = dbmp->maddr;
@@ -315,7 +326,7 @@ retry:	if (LF_ISSET(DB_CREATE)) {
 	dbmp->fd = fd;
 
 	/* If we locked the region, release it now. */
-	if (!F_ISSET(dbmp, MP_ISPRIVATE))
+	if (!F_ISSET(dbmp, MP_MALLOC))
 		UNLOCKREGION(dbmp);
 	return (0);
 
@@ -339,7 +350,7 @@ int
 __memp_rclose(dbmp)
 	DB_MPOOL *dbmp;
 {
-	if (F_ISSET(dbmp, MP_ISPRIVATE)) {
+	if (F_ISSET(dbmp, MP_MALLOC)) {
 		__db_free(dbmp->maddr);
 		return (0);
 	}