about summary refs log tree commit diff
path: root/db2/os/os_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/os/os_map.c')
-rw-r--r--db2/os/os_map.c72
1 files changed, 27 insertions, 45 deletions
diff --git a/db2/os/os_map.c b/db2/os/os_map.c
index 5f0fd790e6..5664a2edec 100644
--- a/db2/os/os_map.c
+++ b/db2/os/os_map.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)os_map.c	10.19 (Sleepycat) 5/3/98";
+static const char sccsid[] = "@(#)os_map.c	10.24 (Sleepycat) 10/12/98";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -27,13 +27,14 @@ static const char sccsid[] = "@(#)os_map.c	10.19 (Sleepycat) 5/3/98";
 #endif
 
 #include "db_int.h"
+#include "os_jump.h"
 #include "common_ext.h"
 
 #ifdef HAVE_MMAP
 static int __os_map __P((char *, int, size_t, int, int, int, void **));
 #endif
 #ifdef HAVE_SHMGET
-static int __os_shmget __P((char *, REGINFO *));
+static int __os_shmget __P((REGINFO *));
 #endif
 
 /*
@@ -165,7 +166,7 @@ __db_mapregion(path, infop)
 #ifdef HAVE_SHMGET
 		if (!called) {
 			called = 1;
-			ret = __os_shmget(path, infop);
+			ret = __os_shmget(infop);
 		}
 #endif
 #ifdef HAVE_MMAP
@@ -207,7 +208,7 @@ __db_mapregion(path, infop)
 #ifdef HAVE_SHMGET
 		if (!called) {
 			called = 1;
-			ret = __os_shmget(path, infop);
+			ret = __os_shmget(infop);
 		}
 #endif
 	}
@@ -271,10 +272,9 @@ __db_unlinkregion(name, infop)
 		called = 1;
 		ret = shmctl(infop->segid, IPC_RMID, NULL) ? errno : 0;
 	}
-#else
-	COMPQUIET(infop, NULL);
 #endif
 #ifdef HAVE_MMAP
+	COMPQUIET(infop, NULL);
 	if (!called) {
 		called = 1;
 		ret = 0;
@@ -388,6 +388,23 @@ __os_map(path, fd, len, is_region, is_anonymous, is_rdonly, addr)
 
 	prot = PROT_READ | (is_rdonly ? 0 : PROT_WRITE);
 
+/*
+ * XXX
+ * Work around a bug in the VMS V7.1 mmap() implementation.  To map a file
+ * into memory on VMS it needs to be opened in a certain way, originally.
+ * To get the file opened in that certain way, the VMS mmap() closes the
+ * file and re-opens it.  When it does this, it doesn't flush any caches
+ * out to disk before closing.  The problem this causes us is that when the
+ * memory cache doesn't get written out, the file isn't big enough to match
+ * the memory chunk and the mmap() call fails.  This call to fsync() fixes
+ * the problem.  DEC thinks this isn't a bug because of language in XPG5
+ * discussing user responsibility for on-disk and in-memory synchronization.
+ */
+#ifdef VMS
+	if (__os_fsync(fd) == -1)
+		return(errno);
+#endif
+
 	/* MAP_FAILED was not defined in early mmap implementations. */
 #ifndef MAP_FAILED
 #define	MAP_FAILED	-1
@@ -407,47 +424,12 @@ __os_map(path, fd, len, is_region, is_anonymous, is_rdonly, addr)
  *	Call the shmget(2) family of functions.
  */
 static int
-__os_shmget(path, infop)
+__os_shmget(infop)
 	REGINFO *infop;
-	char *path;
 {
-	key_t key;
-	int shmflg;
-
-	if (F_ISSET(infop, REGION_CREATED)) {
-		/*
-		 * The return key from ftok(3) is not guaranteed to be unique.
-		 * The nice thing about the shmget(2) interface is that it
-		 * allows you to name anonymous pieces of memory.  The evil
-		 * thing about it is that the name space is separate from the
-		 * filesystem.
-		 */
-#ifdef __hp3000s900
-		{char mpe_path[MAXPATHLEN];
-		/*
-		 * MPE ftok() is broken as of 5.5pp4.  If the file path does
-		 * not start with '/' or '.', then ftok() tries to interpret
-		 * the file path in MPE syntax instead of POSIX HFS syntax.
-		 * The workaround is to prepend "./" to these paths.  See HP
-		 * SR 5003416081 for details.
-		 */
-		if (*path != '/' && *path != '.') {
-			if (strlen(path) + strlen("./") + 1 > sizeof(mpe_path))
-				return (ENAMETOOLONG);
-			mpe_path[0] = '.';
-			mpe_path[1] = '/';
-			(void)strcpy(mpe_path + 2, path);
-			path = mpe_path;
-		}
-		}
-#endif
-		if ((key = ftok(path, 1)) == (key_t)-1)
-			return (errno);
-
-		shmflg = IPC_CREAT | 0600;
-		if ((infop->segid = shmget(key, infop->size, shmflg)) == -1)
-			return (errno);
-	}
+	if (F_ISSET(infop, REGION_CREATED) &&
+	   (infop->segid = shmget(0, infop->size, IPC_PRIVATE | 0600)) == -1)
+		return (errno);
 
 	if ((infop->addr = shmat(infop->segid, NULL, 0)) == (void *)-1) {
 		/*