mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*-
 | 
						|
 * See the file LICENSE for redistribution information.
 | 
						|
 *
 | 
						|
 * 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.25 2002/05/03 15:21:17 bostic Exp $";
 | 
						|
#endif /* not lint */
 | 
						|
 | 
						|
#ifndef NO_SYSTEM_INCLUDES
 | 
						|
#include <sys/types.h>
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
#include "db_int.h"
 | 
						|
#include "dbinc/db_shash.h"
 | 
						|
#include "dbinc/mp.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * __memp_fset --
 | 
						|
 *	Mpool page set-flag routine.
 | 
						|
 *
 | 
						|
 * PUBLIC: int __memp_fset __P((DB_MPOOLFILE *, void *, u_int32_t));
 | 
						|
 */
 | 
						|
int
 | 
						|
__memp_fset(dbmfp, pgaddr, flags)
 | 
						|
	DB_MPOOLFILE *dbmfp;
 | 
						|
	void *pgaddr;
 | 
						|
	u_int32_t flags;
 | 
						|
{
 | 
						|
	BH *bhp;
 | 
						|
	DB_ENV *dbenv;
 | 
						|
	DB_MPOOL *dbmp;
 | 
						|
	DB_MPOOL_HASH *hp;
 | 
						|
	MPOOL *c_mp;
 | 
						|
	u_int32_t n_cache;
 | 
						|
	int ret;
 | 
						|
 | 
						|
	dbmp = dbmfp->dbmp;
 | 
						|
	dbenv = dbmp->dbenv;
 | 
						|
 | 
						|
	PANIC_CHECK(dbenv);
 | 
						|
 | 
						|
	/* Validate arguments. */
 | 
						|
	if (flags == 0)
 | 
						|
		return (__db_ferr(dbenv, "memp_fset", 1));
 | 
						|
 | 
						|
	if ((ret = __db_fchk(dbenv, "memp_fset", flags,
 | 
						|
	    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)
 | 
						|
		return (ret);
 | 
						|
 | 
						|
	if (LF_ISSET(DB_MPOOL_DIRTY) && F_ISSET(dbmfp, MP_READONLY)) {
 | 
						|
		__db_err(dbenv, "%s: dirty flag set for readonly file page",
 | 
						|
		    __memp_fn(dbmfp));
 | 
						|
		return (EACCES);
 | 
						|
	}
 | 
						|
 | 
						|
	/* Convert the page address to a buffer header and hash bucket. */
 | 
						|
	bhp = (BH *)((u_int8_t *)pgaddr - SSZA(BH, buf));
 | 
						|
	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)) {
 | 
						|
		++hp->hash_page_dirty;
 | 
						|
		F_SET(bhp, BH_DIRTY);
 | 
						|
	}
 | 
						|
	if (LF_ISSET(DB_MPOOL_DISCARD))
 | 
						|
		F_SET(bhp, BH_DISCARD);
 | 
						|
 | 
						|
	MUTEX_UNLOCK(dbenv, &hp->hash_mutex);
 | 
						|
	return (0);
 | 
						|
}
 |