#include "db_config.h"
#ifndef lint
static const char revid[] = "$Id: mp_register.c,v 1.2 2004/03/30 01:23:44 jtownsen Exp $";
#endif
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
#endif
#include "db_int.h"
#include "dbinc/db_shash.h"
#include "dbinc/log.h"
#include "dbinc/mp.h"
int
__memp_register_pp(dbenv, ftype, pgin, pgout)
DB_ENV *dbenv;
int ftype;
int (*pgin) __P((DB_ENV *, db_pgno_t, void *, DBT *));
int (*pgout) __P((DB_ENV *, db_pgno_t, void *, DBT *));
{
int rep_check, ret;
PANIC_CHECK(dbenv);
ENV_REQUIRES_CONFIG(dbenv,
dbenv->mp_handle, "DB_ENV->memp_register", DB_INIT_MPOOL);
rep_check = IS_ENV_REPLICATED(dbenv) ? 1 : 0;
if (rep_check)
__env_rep_enter(dbenv);
ret = __memp_register(dbenv, ftype, pgin, pgout);
if (rep_check)
__env_rep_exit(dbenv);
return (ret);
}
int
__memp_register(dbenv, ftype, pgin, pgout)
DB_ENV *dbenv;
int ftype;
int (*pgin) __P((DB_ENV *, db_pgno_t, void *, DBT *));
int (*pgout) __P((DB_ENV *, db_pgno_t, void *, DBT *));
{
DB_MPOOL *dbmp;
DB_MPREG *mpreg;
int ret;
dbmp = dbenv->mp_handle;
MUTEX_THREAD_LOCK(dbenv, dbmp->mutexp);
for (mpreg = LIST_FIRST(&dbmp->dbregq);
mpreg != NULL; mpreg = LIST_NEXT(mpreg, q))
if (mpreg->ftype == ftype) {
mpreg->pgin = pgin;
mpreg->pgout = pgout;
break;
}
MUTEX_THREAD_UNLOCK(dbenv, dbmp->mutexp);
if (mpreg != NULL)
return (0);
if ((ret = __os_malloc(dbenv, sizeof(DB_MPREG), &mpreg)) != 0)
return (ret);
mpreg->ftype = ftype;
mpreg->pgin = pgin;
mpreg->pgout = pgout;
MUTEX_THREAD_LOCK(dbenv, dbmp->mutexp);
LIST_INSERT_HEAD(&dbmp->dbregq, mpreg, q);
MUTEX_THREAD_UNLOCK(dbenv, dbmp->mutexp);
return (0);
}