diff options
Diffstat (limited to 'bdb/mp/mp_fset.c')
-rw-r--r-- | bdb/mp/mp_fset.c | 63 |
1 files changed, 27 insertions, 36 deletions
diff --git a/bdb/mp/mp_fset.c b/bdb/mp/mp_fset.c index 08313c9b6f5..65cd6286ac9 100644 --- a/bdb/mp/mp_fset.c +++ b/bdb/mp/mp_fset.c @@ -1,13 +1,13 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997, 1998, 1999, 2000 + * Copyright (c) 1996-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: mp_fset.c,v 11.13 2000/11/30 00:58:41 ubell Exp $"; +static const char revid[] = "$Id: mp_fset.c,v 11.25 2002/05/03 15:21:17 bostic Exp $"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -15,25 +15,18 @@ static const char revid[] = "$Id: mp_fset.c,v 11.13 2000/11/30 00:58:41 ubell Ex #endif -#ifdef HAVE_RPC -#include "db_server.h" -#endif - #include "db_int.h" -#include "db_shash.h" -#include "mp.h" - -#ifdef HAVE_RPC -#include "gen_client_ext.h" -#include "rpc_client_ext.h" -#endif +#include "dbinc/db_shash.h" +#include "dbinc/mp.h" /* - * memp_fset -- + * __memp_fset -- * Mpool page set-flag routine. + * + * PUBLIC: int __memp_fset __P((DB_MPOOLFILE *, void *, u_int32_t)); */ int -memp_fset(dbmfp, pgaddr, flags) +__memp_fset(dbmfp, pgaddr, flags) DB_MPOOLFILE *dbmfp; void *pgaddr; u_int32_t flags; @@ -41,17 +34,13 @@ memp_fset(dbmfp, pgaddr, flags) BH *bhp; DB_ENV *dbenv; DB_MPOOL *dbmp; - MPOOL *c_mp, *mp; + DB_MPOOL_HASH *hp; + MPOOL *c_mp; + u_int32_t n_cache; int ret; dbmp = dbmfp->dbmp; dbenv = dbmp->dbenv; - mp = dbmp->reginfo[0].primary; - -#ifdef HAVE_RPC - if (F_ISSET(dbenv, DB_ENV_RPCCLIENT)) - return (__dbcl_memp_fset(dbmfp, pgaddr, flags)); -#endif PANIC_CHECK(dbenv); @@ -60,7 +49,7 @@ memp_fset(dbmfp, pgaddr, flags) return (__db_ferr(dbenv, "memp_fset", 1)); if ((ret = __db_fchk(dbenv, "memp_fset", flags, - DB_MPOOL_DIRTY | DB_MPOOL_CLEAN | DB_MPOOL_DISCARD)) != 0) + DB_MPOOL_CLEAN | DB_MPOOL_DIRTY | DB_MPOOL_DISCARD)) != 0) return (ret); if ((ret = __db_fcchk(dbenv, "memp_fset", flags, DB_MPOOL_CLEAN, DB_MPOOL_DIRTY)) != 0) @@ -72,27 +61,29 @@ memp_fset(dbmfp, pgaddr, flags) return (EACCES); } - /* Convert the page address to a buffer header. */ + /* Convert the page address to a buffer header and hash bucket. */ bhp = (BH *)((u_int8_t *)pgaddr - SSZA(BH, buf)); - - /* Convert the buffer header to a cache. */ - c_mp = BH_TO_CACHE(dbmp, bhp); - - R_LOCK(dbenv, dbmp->reginfo); - - if (LF_ISSET(DB_MPOOL_CLEAN) && F_ISSET(bhp, BH_DIRTY)) { - ++c_mp->stat.st_page_clean; - --c_mp->stat.st_page_dirty; + n_cache = NCACHE(dbmp->reginfo[0].primary, bhp->mf_offset, bhp->pgno); + c_mp = dbmp->reginfo[n_cache].primary; + hp = R_ADDR(&dbmp->reginfo[n_cache], c_mp->htab); + hp = &hp[NBUCKET(c_mp, bhp->mf_offset, bhp->pgno)]; + + MUTEX_LOCK(dbenv, &hp->hash_mutex); + + /* Set/clear the page bits. */ + if (LF_ISSET(DB_MPOOL_CLEAN) && + F_ISSET(bhp, BH_DIRTY) && !F_ISSET(bhp, BH_DIRTY_CREATE)) { + DB_ASSERT(hp->hash_page_dirty != 0); + --hp->hash_page_dirty; F_CLR(bhp, BH_DIRTY); } if (LF_ISSET(DB_MPOOL_DIRTY) && !F_ISSET(bhp, BH_DIRTY)) { - --c_mp->stat.st_page_clean; - ++c_mp->stat.st_page_dirty; + ++hp->hash_page_dirty; F_SET(bhp, BH_DIRTY); } if (LF_ISSET(DB_MPOOL_DISCARD)) F_SET(bhp, BH_DISCARD); - R_UNLOCK(dbenv, dbmp->reginfo); + MUTEX_UNLOCK(dbenv, &hp->hash_mutex); return (0); } |