diff options
Diffstat (limited to 'db2/mp/mp_sync.c')
-rw-r--r-- | db2/mp/mp_sync.c | 74 |
1 files changed, 60 insertions, 14 deletions
diff --git a/db2/mp/mp_sync.c b/db2/mp/mp_sync.c index 6d16cf3cd4..33218eef1a 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) |