#include "db_config.h"
#include "db_int.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 *));
{
DB_THREAD_INFO *ip;
ENV *env;
int ret;
env = dbenv->env;
ENV_REQUIRES_CONFIG(env,
env->mp_handle, "DB_ENV->memp_register", DB_INIT_MPOOL);
ENV_ENTER(env, ip);
REPLICATION_WRAP(env,
(__memp_register(env, ftype, pgin, pgout)), 0, ret);
ENV_LEAVE(env, ip);
return (ret);
}
int
__memp_register(env, ftype, pgin, pgout)
ENV *env;
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 = env->mp_handle;
if (ftype == DB_FTYPE_SET) {
if (dbmp->pg_inout != NULL)
return (0);
if ((ret =
__os_malloc(env, sizeof(DB_MPREG), &dbmp->pg_inout)) != 0)
return (ret);
dbmp->pg_inout->ftype = ftype;
dbmp->pg_inout->pgin = pgin;
dbmp->pg_inout->pgout = pgout;
return (0);
}
MUTEX_LOCK(env, dbmp->mutex);
LIST_FOREACH(mpreg, &dbmp->dbregq, q)
if (mpreg->ftype == ftype) {
mpreg->pgin = pgin;
mpreg->pgout = pgout;
break;
}
if (mpreg == NULL) {
if ((ret = __os_malloc(env, sizeof(DB_MPREG), &mpreg)) != 0)
return (ret);
mpreg->ftype = ftype;
mpreg->pgin = pgin;
mpreg->pgout = pgout;
LIST_INSERT_HEAD(&dbmp->dbregq, mpreg, q);
}
MUTEX_UNLOCK(env, dbmp->mutex);
return (0);
}