*** dbinc_auto/mp_ext.h.orig Fri Mar 7 13:31:43 2003 --- dbinc_auto/mp_ext.h Fri Mar 7 13:12:34 2003 *************** *** 18,23 **** --- 18,24 ---- int __memp_fcreate __P((DB_ENV *, DB_MPOOLFILE **, u_int32_t)); int __memp_fopen_int __P((DB_MPOOLFILE *, MPOOLFILE *, const char *, u_int32_t, int, size_t)); int __memp_fclose_int __P((DB_MPOOLFILE *, u_int32_t)); + int __memp_mf_sync __P((DB_MPOOL *, MPOOLFILE *)); int __memp_mf_discard __P((DB_MPOOL *, MPOOLFILE *)); char * __memp_fn __P((DB_MPOOLFILE *)); char * __memp_fns __P((DB_MPOOL *, MPOOLFILE *)); *** mp/mp_sync.c.orig Fri Mar 7 10:37:19 2003 --- mp/mp_sync.c Fri Mar 7 13:12:22 2003 *************** *** 533,553 **** if (ret != 0) goto err; ! /* If we don't find one, open one. */ ! if (dbmfp == NULL) { ! if ((ret = dbenv->memp_fcreate(dbenv, &dbmfp, 0)) != 0) ! goto err; ! ret = __memp_fopen_int( ! dbmfp, mfp, R_ADDR(dbmp->reginfo, mfp->path_off), ! 0, 0, mfp->stat.st_pagesize); ! if (ret == 0) ! ret = __os_fsync(dbenv, dbmfp->fhp); ! if ((t_ret = ! __memp_fclose_int(dbmfp, 0)) != 0 && ret == 0) ! ret = t_ret; ! if (ret != 0) ! goto err; ! } } if (0) { --- 533,541 ---- if (ret != 0) goto err; ! /* If we don't find one, sync the hard way. */ ! if (dbmfp == NULL && (ret = __memp_mf_sync(dbmp, mfp)) != 0) ! goto err; } if (0) { *** mp/mp_fopen.c.orig Thu Dec 19 08:39:08 2002 --- mp/mp_fopen.c Fri Mar 7 13:59:53 2003 *************** *** 903,908 **** --- 903,941 ---- } /* + * __memp_mf_sync -- + * sync an MPOOLFILE. Should only be used if we + * do not already have it open in the current process. + * + * PUBLIC: int __memp_mf_sync __P((DB_MPOOL *, MPOOLFILE *)); + */ + int + __memp_mf_sync(dbmp, mfp) + DB_MPOOL *dbmp; + MPOOLFILE *mfp; + { + DB_ENV *dbenv; + DB_FH fh; + int ret, t_ret; + char *rpath; + + dbenv = dbmp->dbenv; + + if ((ret = __db_appname(dbenv, DB_APP_DATA, + R_ADDR(dbmp->reginfo, mfp->path_off), 0, NULL, &rpath)) == 0) { + if ((ret = __os_open(dbenv, rpath, 0, 0, &fh)) == 0) { + ret = __os_fsync(dbenv, &fh); + if ((t_ret = + __os_closehandle(dbenv, &fh)) != 0 && ret == 0) + ret = t_ret; + } + __os_free(dbenv, rpath); + } + + return (ret); + } + + /* * __memp_mf_discard -- * Discard an MPOOLFILE. * *************** *** 914,923 **** MPOOLFILE *mfp; { DB_ENV *dbenv; - DB_FH fh; DB_MPOOL_STAT *sp; MPOOL *mp; - char *rpath; int ret; dbenv = dbmp->dbenv; --- 947,954 ---- *************** *** 932,946 **** * flushed to satisfy a future checkpoint, but when the checkpoint * calls mpool sync, the sync code won't know anything about them. */ ! if (!F_ISSET(mfp, MP_DEADFILE) && ! (ret = __db_appname(dbenv, DB_APP_DATA, ! R_ADDR(dbmp->reginfo, mfp->path_off), 0, NULL, &rpath)) == 0) { ! if ((ret = __os_open(dbenv, rpath, 0, 0, &fh)) == 0) { ! ret = __os_fsync(dbenv, &fh); ! (void)__os_closehandle(dbenv, &fh); ! } ! __os_free(dbenv, rpath); ! } /* * We have to release the MPOOLFILE lock before acquiring the region --- 963,970 ---- * flushed to satisfy a future checkpoint, but when the checkpoint * calls mpool sync, the sync code won't know anything about them. */ ! if (!F_ISSET(mfp, MP_DEADFILE)) ! ret = __memp_mf_sync(dbmp, mfp); /* * We have to release the MPOOLFILE lock before acquiring the region