aboutsummaryrefslogtreecommitdiff
path: root/db2/mp/mp_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/mp/mp_sync.c')
-rw-r--r--db2/mp/mp_sync.c74
1 files changed, 60 insertions, 14 deletions
diff --git a/db2/mp/mp_sync.c b/db2/mp/mp_sync.c
index 6d16cf3..33218ee 100644
--- a/db2/mp/mp_sync.c
+++ b/db2/mp/mp_sync.c
@@ -1,13 +1,13 @@
/*-
* 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_sync.c 10.19 (Sleepycat) 12/3/97";
+static const char sccsid[] = "@(#)mp_sync.c 10.25 (Sleepycat) 4/26/98";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
@@ -15,7 +15,6 @@ static const char sccsid[] = "@(#)mp_sync.c 10.19 (Sleepycat) 12/3/97";
#include <errno.h>
#include <stdlib.h>
-#include <string.h>
#endif
#include "db_int.h"
@@ -25,6 +24,7 @@ static const char sccsid[] = "@(#)mp_sync.c 10.19 (Sleepycat) 12/3/97";
#include "common_ext.h"
static int __bhcmp __P((const void *, const void *));
+static int __memp_fsync __P((DB_MPOOLFILE *));
/*
* memp_sync --
@@ -145,7 +145,8 @@ memp_sync(dbmp, lsnp)
bharray[ar_cnt++] = bhp;
}
} else
- F_CLR(bhp, BH_WRITE);
+ if (F_ISSET(bhp, BH_WRITE))
+ F_CLR(bhp, BH_WRITE);
/* If there no buffers we can write immediately, we're done. */
if (ar_cnt == 0) {
@@ -235,10 +236,8 @@ int
memp_fsync(dbmfp)
DB_MPOOLFILE *dbmfp;
{
- BH *bhp, **bharray;
DB_MPOOL *dbmp;
- size_t mf_offset;
- int ar_cnt, cnt, nalloc, next, pincnt, ret, wrote;
+ int is_tmp;
dbmp = dbmfp->dbmp;
@@ -250,14 +249,62 @@ memp_fsync(dbmfp)
if (F_ISSET(dbmfp, MP_READONLY))
return (0);
- ret = 0;
LOCKREGION(dbmp);
- if (F_ISSET(dbmfp->mfp, MP_TEMP))
- ret = 1;
+ is_tmp = F_ISSET(dbmfp->mfp, MP_TEMP);
UNLOCKREGION(dbmp);
- if (ret)
+ if (is_tmp)
return (0);
+ return (__memp_fsync(dbmfp));
+}
+
+/*
+ * __mp_xxx_fd --
+ * Return a file descriptor for DB 1.85 compatibility locking.
+ *
+ * PUBLIC: int __mp_xxx_fd __P((DB_MPOOLFILE *, int *));
+ */
+int
+__mp_xxx_fd(dbmfp, fdp)
+ DB_MPOOLFILE *dbmfp;
+ int *fdp;
+{
+ int ret;
+
+ /*
+ * This is a truly spectacular layering violation, intended ONLY to
+ * support compatibility for the DB 1.85 DB->fd call.
+ *
+ * Sync the database file to disk, creating the file as necessary.
+ *
+ * We skip the MP_READONLY and MP_TEMP tests done by memp_fsync(3).
+ * The MP_READONLY test isn't interesting because we will either
+ * already have a file descriptor (we opened the database file for
+ * reading) or we aren't readonly (we created the database which
+ * requires write privileges). The MP_TEMP test isn't interesting
+ * because we want to write to the backing file regardless so that
+ * we get a file descriptor to return.
+ */
+ ret = dbmfp->fd == -1 ? __memp_fsync(dbmfp) : 0;
+
+ return ((*fdp = dbmfp->fd) == -1 ? ENOENT : ret);
+}
+
+/*
+ * __memp_fsync --
+ * Mpool file internal sync function.
+ */
+static int
+__memp_fsync(dbmfp)
+ DB_MPOOLFILE *dbmfp;
+{
+ BH *bhp, **bharray;
+ DB_MPOOL *dbmp;
+ size_t mf_offset;
+ int ar_cnt, cnt, nalloc, next, pincnt, ret, wrote;
+
+ ret = 0;
+ dbmp = dbmfp->dbmp;
mf_offset = R_OFFSET(dbmp, dbmfp->mfp);
/*
@@ -359,7 +406,6 @@ err: UNLOCKREGION(dbmp);
if (ret == 0)
return (pincnt == 0 ? __db_fsync(dbmfp->fd) : DB_INCOMPLETE);
return (ret);
-
}
/*
@@ -453,8 +499,8 @@ __bhcmp(p1, p2)
{
BH *bhp1, *bhp2;
- bhp1 = *(BH **)p1;
- bhp2 = *(BH **)p2;
+ bhp1 = *(BH * const *)p1;
+ bhp2 = *(BH * const *)p2;
/* Sort by file (shared memory pool offset). */
if (bhp1->mf_offset < bhp2->mf_offset)