aboutsummaryrefslogtreecommitdiff
path: root/db2/mp/mp_fput.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/mp/mp_fput.c')
-rw-r--r--db2/mp/mp_fput.c153
1 files changed, 0 insertions, 153 deletions
diff --git a/db2/mp/mp_fput.c b/db2/mp/mp_fput.c
deleted file mode 100644
index c551f97..0000000
--- a/db2/mp/mp_fput.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*-
- * See the file LICENSE for redistribution information.
- *
- * Copyright (c) 1996, 1997, 1998
- * Sleepycat Software. All rights reserved.
- */
-#include "config.h"
-
-#ifndef lint
-static const char sccsid[] = "@(#)mp_fput.c 10.24 (Sleepycat) 9/27/98";
-#endif /* not lint */
-
-#ifndef NO_SYSTEM_INCLUDES
-#include <sys/types.h>
-
-#include <errno.h>
-#endif
-
-#include "db_int.h"
-#include "shqueue.h"
-#include "db_shash.h"
-#include "mp.h"
-#include "common_ext.h"
-
-/*
- * memp_fput --
- * Mpool file put function.
- */
-int
-memp_fput(dbmfp, pgaddr, flags)
- DB_MPOOLFILE *dbmfp;
- void *pgaddr;
- u_int32_t flags;
-{
- BH *bhp;
- DB_MPOOL *dbmp;
- MPOOL *mp;
- int wrote, ret;
-
- dbmp = dbmfp->dbmp;
- mp = dbmp->mp;
-
- MP_PANIC_CHECK(dbmp);
-
- /* Validate arguments. */
- if (flags) {
- if ((ret = __db_fchk(dbmp->dbenv, "memp_fput", flags,
- DB_MPOOL_CLEAN | DB_MPOOL_DIRTY | DB_MPOOL_DISCARD)) != 0)
- return (ret);
- if ((ret = __db_fcchk(dbmp->dbenv, "memp_fput",
- flags, DB_MPOOL_CLEAN, DB_MPOOL_DIRTY)) != 0)
- return (ret);
-
- if (LF_ISSET(DB_MPOOL_DIRTY) && F_ISSET(dbmfp, MP_READONLY)) {
- __db_err(dbmp->dbenv,
- "%s: dirty flag set for readonly file page",
- __memp_fn(dbmfp));
- return (EACCES);
- }
- }
-
- LOCKREGION(dbmp);
-
- /* Decrement the pinned reference count. */
- if (dbmfp->pinref == 0)
- __db_err(dbmp->dbenv,
- "%s: put: more blocks returned than retrieved",
- __memp_fn(dbmfp));
- else
- --dbmfp->pinref;
-
- /*
- * If we're mapping the file, there's nothing to do. Because we can
- * stop mapping the file at any time, we have to check on each buffer
- * to see if the address we gave the application was part of the map
- * region.
- */
- if (dbmfp->addr != NULL && pgaddr >= dbmfp->addr &&
- (u_int8_t *)pgaddr <= (u_int8_t *)dbmfp->addr + dbmfp->len) {
- UNLOCKREGION(dbmp);
- return (0);
- }
-
- /* Convert the page address to a buffer header. */
- bhp = (BH *)((u_int8_t *)pgaddr - SSZA(BH, buf));
-
- /* Set/clear the page bits. */
- if (LF_ISSET(DB_MPOOL_CLEAN) && F_ISSET(bhp, BH_DIRTY)) {
- ++mp->stat.st_page_clean;
- --mp->stat.st_page_dirty;
- F_CLR(bhp, BH_DIRTY);
- }
- if (LF_ISSET(DB_MPOOL_DIRTY) && !F_ISSET(bhp, BH_DIRTY)) {
- --mp->stat.st_page_clean;
- ++mp->stat.st_page_dirty;
- F_SET(bhp, BH_DIRTY);
- }
- if (LF_ISSET(DB_MPOOL_DISCARD))
- F_SET(bhp, BH_DISCARD);
-
- /*
- * Check for a reference count going to zero. This can happen if the
- * application returns a page twice.
- */
- if (bhp->ref == 0) {
- __db_err(dbmp->dbenv, "%s: page %lu: unpinned page returned",
- __memp_fn(dbmfp), (u_long)bhp->pgno);
- UNLOCKREGION(dbmp);
- return (EINVAL);
- }
-
- /*
- * If more than one reference to the page, we're done. Ignore the
- * discard flags (for now) and leave it at its position in the LRU
- * chain. The rest gets done at last reference close.
- */
- if (--bhp->ref > 0) {
- UNLOCKREGION(dbmp);
- return (0);
- }
-
- /*
- * If this buffer is scheduled for writing because of a checkpoint, we
- * need to write it (if we marked it dirty), or update the checkpoint
- * counters (if we didn't mark it dirty). If we try to write it and
- * can't, that's not necessarily an error, but set a flag so that the
- * next time the memp_sync function runs we try writing it there, as
- * the checkpoint application better be able to write all of the files.
- */
- if (F_ISSET(bhp, BH_WRITE)) {
- if (F_ISSET(bhp, BH_DIRTY)) {
- if (__memp_bhwrite(dbmp,
- dbmfp->mfp, bhp, NULL, &wrote) != 0 || !wrote)
- F_SET(mp, MP_LSN_RETRY);
- } else {
- F_CLR(bhp, BH_WRITE);
-
- --dbmfp->mfp->lsn_cnt;
- --mp->lsn_cnt;
- }
- }
-
- /* Move the buffer to the head/tail of the LRU chain. */
- SH_TAILQ_REMOVE(&mp->bhq, bhp, q, __bh);
- if (F_ISSET(bhp, BH_DISCARD))
- SH_TAILQ_INSERT_HEAD(&mp->bhq, bhp, q, __bh);
- else
- SH_TAILQ_INSERT_TAIL(&mp->bhq, bhp, q);
-
-
- UNLOCKREGION(dbmp);
- return (0);
-}