#include "db_config.h"
#ifndef lint
static const char revid[] = "$Id: rep_region.c,v 1.2 2004/03/30 01:23:56 jtownsen Exp $";
#endif
#ifndef NO_SYSTEM_INCLUDES
#if TIME_WITH_SYS_TIME
#include <sys/time.h>
#include <time.h>
#else
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#else
#include <time.h>
#endif
#endif
#include <string.h>
#endif
#include "db_int.h"
#include "dbinc/db_page.h"
#include "dbinc/log.h"
#include "dbinc/db_am.h"
int
__rep_region_init(dbenv)
DB_ENV *dbenv;
{
REGENV *renv;
REGINFO *infop;
DB_MUTEX *db_mutexp;
DB_REP *db_rep;
REP *rep;
int ret;
db_rep = dbenv->rep_handle;
infop = dbenv->reginfo;
renv = infop->primary;
ret = 0;
MUTEX_LOCK(dbenv, &renv->mutex);
if (renv->rep_off == INVALID_ROFF) {
if ((ret = __db_shalloc(infop->addr,
sizeof(REP), MUTEX_ALIGN, &rep)) != 0)
goto err;
memset(rep, 0, sizeof(*rep));
rep->tally_off = INVALID_ROFF;
rep->v2tally_off = INVALID_ROFF;
renv->rep_off = R_OFFSET(infop, rep);
if ((ret = __db_mutex_setup(dbenv, infop, &rep->mutex,
MUTEX_NO_RECORD)) != 0)
goto err;
if ((ret = __db_shalloc(infop->addr, sizeof(DB_MUTEX),
MUTEX_ALIGN, &db_mutexp)) != 0)
goto err;
rep->db_mutex_off = R_OFFSET(infop, db_mutexp);
if ((ret = __db_mutex_setup(dbenv, infop, db_mutexp,
MUTEX_NO_RECORD)) != 0)
goto err;
rep->eid = DB_EID_INVALID;
rep->master_id = DB_EID_INVALID;
rep->gen = 0;
rep->egen = rep->gen + 1;
rep->request_gap = DB_REP_REQUEST_GAP;
rep->max_gap = DB_REP_MAX_GAP;
F_SET(rep, REP_F_NOARCHIVE);
(void)time(&rep->timestamp);
} else
rep = R_ADDR(infop, renv->rep_off);
MUTEX_UNLOCK(dbenv, &renv->mutex);
db_rep->rep_mutexp = &rep->mutex;
db_rep->db_mutexp = R_ADDR(infop, rep->db_mutex_off);
db_rep->region = rep;
return (0);
err: MUTEX_UNLOCK(dbenv, &renv->mutex);
return (ret);
}
int
__rep_region_destroy(dbenv)
DB_ENV *dbenv;
{
DB_REP *db_rep;
int ret, t_ret;
ret = t_ret = 0;
db_rep = dbenv->rep_handle;
if (db_rep != NULL) {
if (db_rep->rep_mutexp != NULL)
ret = __db_mutex_destroy(db_rep->rep_mutexp);
if (db_rep->db_mutexp != NULL)
t_ret = __db_mutex_destroy(db_rep->db_mutexp);
}
return (ret == 0 ? t_ret : ret);
}
void
__rep_dbenv_refresh(dbenv)
DB_ENV *dbenv;
{
if (REP_ON(dbenv))
((DB_REP *)dbenv->rep_handle)->region = NULL;
return;
}
int
__rep_dbenv_close(dbenv)
DB_ENV *dbenv;
{
if (REP_ON(dbenv)) {
__os_free(dbenv, dbenv->rep_handle);
dbenv->rep_handle = NULL;
dbenv->rep_send = NULL;
}
return (0);
}
int
__rep_preclose(dbenv, do_closefiles)
DB_ENV *dbenv;
int do_closefiles;
{
DB *dbp;
DB_REP *db_rep;
int ret, t_ret;
ret = t_ret = 0;
if (!REP_ON(dbenv))
return (0);
db_rep = dbenv->rep_handle;
if ((dbp = db_rep->rep_db) != NULL) {
MUTEX_LOCK(dbenv, db_rep->db_mutexp);
ret = __db_close(dbp, NULL, DB_NOSYNC);
db_rep->rep_db = NULL;
MUTEX_UNLOCK(dbenv, db_rep->db_mutexp);
}
if (do_closefiles)
t_ret = __dbreg_close_files(dbenv);
return (ret == 0 ? t_ret : ret);
}