about summary refs log tree commit diff
path: root/db2/mp/mp_fopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/mp/mp_fopen.c')
-rw-r--r--db2/mp/mp_fopen.c128
1 files changed, 70 insertions, 58 deletions
diff --git a/db2/mp/mp_fopen.c b/db2/mp/mp_fopen.c
index 0f41122373..a4cbac8d4e 100644
--- a/db2/mp/mp_fopen.c
+++ b/db2/mp/mp_fopen.c
@@ -1,24 +1,20 @@
 /*-
  * See the file LICENSE for redistribution information.
  *
- * Copyright (c) 1996, 1997
+ * Copyright (c) 1996, 1997, 1998
  *	Sleepycat Software.  All rights reserved.
  */
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mp_fopen.c	10.37 (Sleepycat) 1/18/98";
+static const char sccsid[] = "@(#)mp_fopen.c	10.47 (Sleepycat) 5/4/98";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
 #include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
 
 #include <errno.h>
-#include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #endif
 
 #include "db_int.h"
@@ -28,22 +24,21 @@ static const char sccsid[] = "@(#)mp_fopen.c	10.37 (Sleepycat) 1/18/98";
 #include "common_ext.h"
 
 static int __memp_mf_close __P((DB_MPOOL *, DB_MPOOLFILE *));
-static int __memp_mf_open __P((DB_MPOOL *, const char *,
-    int, size_t, db_pgno_t, int, DBT *, u_int8_t *, MPOOLFILE **));
+static int __memp_mf_open __P((DB_MPOOL *,
+    const char *, size_t, db_pgno_t, DB_MPOOL_FINFO *, MPOOLFILE **));
 
 /*
  * memp_fopen --
  *	Open a backing file for the memory pool.
  */
 int
-memp_fopen(dbmp, path, ftype,
-    flags, mode, pagesize, lsn_offset, pgcookie, fileid, retp)
+memp_fopen(dbmp, path, flags, mode, pagesize, finfop, retp)
 	DB_MPOOL *dbmp;
 	const char *path;
-	int ftype, flags, mode, lsn_offset;
+	u_int32_t flags;
+	int mode;
 	size_t pagesize;
-	DBT *pgcookie;
-	u_int8_t *fileid;
+	DB_MPOOL_FINFO *finfop;
 	DB_MPOOLFILE **retp;
 {
 	int ret;
@@ -59,31 +54,31 @@ memp_fopen(dbmp, path, ftype,
 		return (EINVAL);
 	}
 
-	return (__memp_fopen(dbmp, NULL, path, ftype,
-	    flags, mode, pagesize, lsn_offset, pgcookie, fileid, 1, retp));
+	return (__memp_fopen(dbmp,
+	    NULL, path, flags, mode, pagesize, 1, finfop, retp));
 }
 
 /*
  * __memp_fopen --
  *	Open a backing file for the memory pool; internal version.
  *
- * PUBLIC: int __memp_fopen __P((DB_MPOOL *, MPOOLFILE *, const char *, int,
- * PUBLIC:    int, int, size_t, int, DBT *, u_int8_t *, int, DB_MPOOLFILE **));
+ * PUBLIC: int __memp_fopen __P((DB_MPOOL *, MPOOLFILE *, const char *,
+ * PUBLIC:    u_int32_t, int, size_t, int, DB_MPOOL_FINFO *, DB_MPOOLFILE **));
  */
 int
-__memp_fopen(dbmp, mfp, path,
-    ftype, flags, mode, pagesize, lsn_offset, pgcookie, fileid, needlock, retp)
+__memp_fopen(dbmp, mfp, path, flags, mode, pagesize, needlock, finfop, retp)
 	DB_MPOOL *dbmp;
 	MPOOLFILE *mfp;
 	const char *path;
-	int ftype, flags, mode, lsn_offset, needlock;
+	u_int32_t flags;
+	int mode, needlock;
 	size_t pagesize;
-	DBT *pgcookie;
-	u_int8_t *fileid;
+	DB_MPOOL_FINFO *finfop;
 	DB_MPOOLFILE **retp;
 {
 	DB_ENV *dbenv;
 	DB_MPOOLFILE *dbmfp;
+	DB_MPOOL_FINFO finfo;
 	db_pgno_t last_pgno;
 	size_t size;
 	u_int32_t mbytes, bytes;
@@ -91,18 +86,34 @@ __memp_fopen(dbmp, mfp, path,
 	u_int8_t idbuf[DB_FILE_ID_LEN];
 	char *rpath;
 
-	/*
-	 * XXX
-	 * If mfp is provided, the following arguments do NOT need to be
-	 * specified:
-	 *      lsn_offset
-	 *      pgcookie
-	 *      fileid
-	 */
 	dbenv = dbmp->dbenv;
 	ret = 0;
 	rpath = NULL;
 
+	/*
+	 * If mfp is provided, we take the DB_MPOOL_FINFO information from
+	 * the mfp.  We don't bother initializing everything, because some
+	 * of them are expensive to acquire.  If no mfp is provided and the
+	 * finfop argument is NULL, we default the values.
+	 */
+	if (finfop == NULL) {
+		memset(&finfo, 0, sizeof(finfo));
+		if (mfp != NULL) {
+			finfo.ftype = mfp->ftype;
+			finfo.pgcookie = NULL;
+			finfo.fileid = NULL;
+			finfo.lsn_offset = mfp->lsn_off;
+			finfo.clear_len = mfp->clear_len;
+		} else {
+			finfo.ftype = 0;
+			finfo.pgcookie = NULL;
+			finfo.fileid = NULL;
+			finfo.lsn_offset = -1;
+			finfo.clear_len = 0;
+		}
+		finfop = &finfo;
+	}
+
 	/* Allocate and initialize the per-process structure. */
 	if ((dbmfp =
 	    (DB_MPOOLFILE *)__db_calloc(1, sizeof(DB_MPOOLFILE))) == NULL) {
@@ -126,11 +137,11 @@ __memp_fopen(dbmp, mfp, path,
 	} else {
 		/* Get the real name for this file and open it. */
 		if ((ret = __db_appname(dbenv,
-		    DB_APP_DATA, NULL, path, NULL, &rpath)) != 0)
+		    DB_APP_DATA, NULL, path, 0, NULL, &rpath)) != 0)
 			goto err;
 		if ((ret = __db_open(rpath,
-		    LF_ISSET(DB_CREATE | DB_RDONLY), DB_CREATE | DB_RDONLY,
-		    mode, &dbmfp->fd)) != 0) {
+		   LF_ISSET(DB_CREATE | DB_RDONLY),
+		   DB_CREATE | DB_RDONLY, mode, &dbmfp->fd)) != 0) {
 			__db_err(dbenv, "%s: %s", rpath, strerror(ret));
 			goto err;
 		}
@@ -156,12 +167,11 @@ __memp_fopen(dbmp, mfp, path,
 		 * don't use timestamps, otherwise there'd be no chance of any
 		 * other process joining the party.
 		 */
-		if (mfp == NULL && fileid == NULL) {
+		if (finfop->fileid == NULL) {
 			if ((ret = __db_fileid(dbenv, rpath, 0, idbuf)) != 0)
 				goto err;
-			fileid = idbuf;
+			finfop->fileid = idbuf;
 		}
-		FREES(rpath);
 	}
 
 	/*
@@ -173,8 +183,8 @@ __memp_fopen(dbmp, mfp, path,
 		LOCKREGION(dbmp);
 
 	if (mfp == NULL)
-		ret = __memp_mf_open(dbmp, path, ftype,
-		    pagesize, last_pgno, lsn_offset, pgcookie, fileid, &mfp);
+		ret = __memp_mf_open(dbmp,
+		    path, pagesize, last_pgno, finfop, &mfp);
 	else {
 		++mfp->ref;
 		ret = 0;
@@ -218,7 +228,7 @@ __memp_fopen(dbmp, mfp, path,
 			F_CLR(mfp, MP_CAN_MMAP);
 		if (path == NULL)
 			F_CLR(mfp, MP_CAN_MMAP);
-		if (ftype != 0)
+		if (finfop->ftype != 0)
 			F_CLR(mfp, MP_CAN_MMAP);
 		if (LF_ISSET(DB_NOMMAP))
 			F_CLR(mfp, MP_CAN_MMAP);
@@ -229,11 +239,14 @@ __memp_fopen(dbmp, mfp, path,
 	dbmfp->addr = NULL;
 	if (F_ISSET(mfp, MP_CAN_MMAP)) {
 		dbmfp->len = size;
-		if (__db_map(dbmfp->fd, dbmfp->len, 1, 1, &dbmfp->addr) != 0) {
+		if (__db_mapfile(rpath,
+		    dbmfp->fd, dbmfp->len, 1, &dbmfp->addr) != 0) {
 			dbmfp->addr = NULL;
 			F_CLR(mfp, MP_CAN_MMAP);
 		}
 	}
+	if (rpath != NULL)
+		FREES(rpath);
 
 	LOCKHANDLE(dbmp, dbmp->mutexp);
 	TAILQ_INSERT_TAIL(&dbmp->dbmfq, dbmfp, q);
@@ -260,15 +273,12 @@ err:	/*
  *	Open an MPOOLFILE.
  */
 static int
-__memp_mf_open(dbmp, path,
-    ftype, pagesize, last_pgno, lsn_offset, pgcookie, fileid, retp)
+__memp_mf_open(dbmp, path, pagesize, last_pgno, finfop, retp)
 	DB_MPOOL *dbmp;
 	const char *path;
-	int ftype, lsn_offset;
 	size_t pagesize;
 	db_pgno_t last_pgno;
-	DBT *pgcookie;
-	u_int8_t *fileid;
+	DB_MPOOL_FINFO *finfop;
 	MPOOLFILE **retp;
 {
 	MPOOLFILE *mfp;
@@ -286,12 +296,13 @@ __memp_mf_open(dbmp, path,
 		    mfp != NULL; mfp = SH_TAILQ_NEXT(mfp, q, __mpoolfile)) {
 			if (F_ISSET(mfp, MP_TEMP))
 				continue;
-			if (!memcmp(fileid,
+			if (!memcmp(finfop->fileid,
 			    R_ADDR(dbmp, mfp->fileid_off), DB_FILE_ID_LEN)) {
-				if (ftype != mfp->ftype ||
+				if (finfop->clear_len != mfp->clear_len ||
+				    finfop->ftype != mfp->ftype ||
 				    pagesize != mfp->stat.st_pagesize) {
 					__db_err(dbmp->dbenv,
-					    "%s: ftype or pagesize changed",
+			    "%s: ftype, clear length or pagesize changed",
 					    path);
 					return (EINVAL);
 				}
@@ -311,8 +322,9 @@ __memp_mf_open(dbmp, path,
 	/* Initialize the structure. */
 	memset(mfp, 0, sizeof(MPOOLFILE));
 	mfp->ref = 1;
-	mfp->ftype = ftype;
-	mfp->lsn_off = lsn_offset;
+	mfp->ftype = finfop->ftype;
+	mfp->lsn_off = finfop->lsn_offset;
+	mfp->clear_len = finfop->clear_len;
 
 	/*
 	 * If the user specifies DB_MPOOL_LAST or DB_MPOOL_NEW on a memp_fget,
@@ -320,7 +332,7 @@ __memp_mf_open(dbmp, path,
 	 * it away.
 	 */
 	mfp->stat.st_pagesize = pagesize;
-	mfp->last_pgno = last_pgno;
+	mfp->orig_last_pgno = mfp->last_pgno = last_pgno;
 
 	F_SET(mfp, MP_CAN_MMAP);
 	if (ISTEMPORARY)
@@ -336,19 +348,19 @@ __memp_mf_open(dbmp, path,
 		if ((ret = __memp_ralloc(dbmp,
 		    DB_FILE_ID_LEN, &mfp->fileid_off, &p)) != 0)
 			goto err;
-		memcpy(p, fileid, DB_FILE_ID_LEN);
+		memcpy(p, finfop->fileid, DB_FILE_ID_LEN);
 	}
 
 	/* Copy the page cookie into shared memory. */
-	if (pgcookie == NULL || pgcookie->size == 0) {
+	if (finfop->pgcookie == NULL || finfop->pgcookie->size == 0) {
 		mfp->pgcookie_len = 0;
 		mfp->pgcookie_off = 0;
 	} else {
 		if ((ret = __memp_ralloc(dbmp,
-		    pgcookie->size, &mfp->pgcookie_off, &p)) != 0)
+		    finfop->pgcookie->size, &mfp->pgcookie_off, &p)) != 0)
 			goto err;
-		memcpy(p, pgcookie->data, pgcookie->size);
-		mfp->pgcookie_len = pgcookie->size;
+		memcpy(p, finfop->pgcookie->data, finfop->pgcookie->size);
+		mfp->pgcookie_len = finfop->pgcookie->size;
 	}
 
 	/* Prepend the MPOOLFILE to the list of MPOOLFILE's. */
@@ -397,7 +409,7 @@ memp_fclose(dbmfp)
 
 	/* Discard any mmap information. */
 	if (dbmfp->addr != NULL &&
-	    (ret = __db_unmap(dbmfp->addr, dbmfp->len)) != 0)
+	    (ret = __db_unmapfile(dbmfp->addr, dbmfp->len)) != 0)
 		__db_err(dbmp->dbenv,
 		    "%s: %s", __memp_fn(dbmfp), strerror(ret));
 
@@ -480,13 +492,13 @@ __memp_mf_close(dbmp, dbmfp)
 	SH_TAILQ_REMOVE(&mp->mpfq, mfp, q, __mpoolfile);
 
 	/* Free the space. */
-	__db_shalloc_free(dbmp->addr, mfp);
 	if (mfp->path_off != 0)
 		__db_shalloc_free(dbmp->addr, R_ADDR(dbmp, mfp->path_off));
 	if (mfp->fileid_off != 0)
 		__db_shalloc_free(dbmp->addr, R_ADDR(dbmp, mfp->fileid_off));
 	if (mfp->pgcookie_off != 0)
 		__db_shalloc_free(dbmp->addr, R_ADDR(dbmp, mfp->pgcookie_off));
+	__db_shalloc_free(dbmp->addr, mfp);
 
 ret1:	UNLOCKREGION(dbmp);
 	return (0);