summaryrefslogtreecommitdiff
path: root/db2/common
diff options
context:
space:
mode:
Diffstat (limited to 'db2/common')
-rw-r--r--db2/common/db_appinit.c40
-rw-r--r--db2/common/db_apprec.c36
-rw-r--r--db2/common/db_byteorder.c14
-rw-r--r--db2/common/db_region.c103
4 files changed, 110 insertions, 83 deletions
diff --git a/db2/common/db_appinit.c b/db2/common/db_appinit.c
index 51d9262859..74ba9ff426 100644
--- a/db2/common/db_appinit.c
+++ b/db2/common/db_appinit.c
@@ -8,7 +8,7 @@
#include "config.h"
#ifndef lint
-static const char sccsid[] = "@(#)db_appinit.c 10.33 (Sleepycat) 8/28/97";
+static const char sccsid[] = "@(#)db_appinit.c 10.36 (Sleepycat) 10/28/97";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
@@ -93,6 +93,10 @@ db_appinit(db_home, db_config, dbenv, flags)
LF_ISSET(RECOVERY_FLAGS) != RECOVERY_FLAGS)
return (__db_ferr(dbenv, "db_appinit", 1));
+ /* Convert the db_appinit(3) flags. */
+ if (LF_ISSET(DB_THREAD))
+ F_SET(dbenv, DB_ENV_THREAD);
+
fp = NULL;
/* Set the database home. */
@@ -126,7 +130,7 @@ db_appinit(db_home, db_config, dbenv, flags)
goto err;
/* Indicate that the path names have been set. */
- F_SET(dbenv, DB_APP_INIT);
+ F_SET(dbenv, DB_ENV_APPINIT);
/*
* If we are doing recovery, remove all the regions.
@@ -300,7 +304,8 @@ __db_appname(dbenv, appname, dir, file, fdp, namep)
* return.
*/
if (file != NULL && __db_abspath(file))
- return ((*namep = (char *)strdup(file)) == NULL ? ENOMEM : 0);
+ return ((*namep =
+ (char *)__db_strdup(file)) == NULL ? ENOMEM : 0);
if (dir != NULL && __db_abspath(dir)) {
a = dir;
goto done;
@@ -335,7 +340,7 @@ __db_appname(dbenv, appname, dir, file, fdp, namep)
*/
retry: switch (appname) {
case DB_APP_NONE:
- if (dbenv == NULL || !F_ISSET(dbenv, DB_APP_INIT)) {
+ if (dbenv == NULL || !F_ISSET(dbenv, DB_ENV_APPINIT)) {
if (dir == NULL)
goto tmp;
a = dir;
@@ -355,7 +360,7 @@ retry: switch (appname) {
tmp_create = 1;
goto tmp;
}
- if (dbenv == NULL || !F_ISSET(dbenv, DB_APP_INIT))
+ if (dbenv == NULL || !F_ISSET(dbenv, DB_ENV_APPINIT))
a = PATH_DOT;
else {
a = dbenv->db_home;
@@ -367,7 +372,7 @@ retry: switch (appname) {
}
break;
case DB_APP_LOG:
- if (dbenv == NULL || !F_ISSET(dbenv, DB_APP_INIT)) {
+ if (dbenv == NULL || !F_ISSET(dbenv, DB_ENV_APPINIT)) {
if (dir == NULL)
goto tmp;
a = dir;
@@ -385,7 +390,7 @@ retry: switch (appname) {
}
tmp_create = 1;
- if (dbenv == NULL || !F_ISSET(dbenv, DB_APP_INIT))
+ if (dbenv == NULL || !F_ISSET(dbenv, DB_ENV_APPINIT))
goto tmp;
else {
a = dbenv->db_home;
@@ -396,7 +401,7 @@ retry: switch (appname) {
/* Reference a file from the appropriate temporary directory. */
if (0) {
-tmp: if (dbenv == NULL || !F_ISSET(dbenv, DB_APP_INIT)) {
+tmp: if (dbenv == NULL || !F_ISSET(dbenv, DB_ENV_APPINIT)) {
memset(&etmp, 0, sizeof(etmp));
if ((ret = __db_tmp_dir(&etmp, DB_USE_ENVIRON)) != 0)
return (ret);
@@ -412,7 +417,7 @@ done: len =
(c == NULL ? 0 : strlen(c) + 1) +
(file == NULL ? 0 : strlen(file) + 1);
- if ((start = (char *)malloc(len)) == NULL) {
+ if ((start = (char *)__db_malloc(len)) == NULL) {
__db_err(dbenv, "%s", strerror(ENOMEM));
if (tmp_free)
FREES(etmp.db_tmp_dir);
@@ -484,7 +489,7 @@ __db_home(dbenv, db_home, flags)
if (p == NULL)
return (0);
- if ((dbenv->db_home = (char *)strdup(p)) == NULL) {
+ if ((dbenv->db_home = (char *)__db_strdup(p)) == NULL) {
__db_err(dbenv, "%s", strerror(ENOMEM));
return (ENOMEM);
}
@@ -509,7 +514,7 @@ __db_parse(dbenv, s)
* We need to strdup the argument in case the caller passed us
* static data.
*/
- if ((local_s = (char *)strdup(s)) == NULL)
+ if ((local_s = (char *)__db_strdup(s)) == NULL)
return (ENOMEM);
tp = local_s;
@@ -526,14 +531,15 @@ illegal: ret = EINVAL;
#define DATA_INIT_CNT 20 /* Start with 20 data slots. */
if (!strcmp(name, "DB_DATA_DIR")) {
if (dbenv->db_data_dir == NULL) {
- if ((dbenv->db_data_dir = (char **)calloc(DATA_INIT_CNT,
+ if ((dbenv->db_data_dir =
+ (char **)__db_calloc(DATA_INIT_CNT,
sizeof(char **))) == NULL)
goto nomem;
dbenv->data_cnt = DATA_INIT_CNT;
} else if (dbenv->data_next == dbenv->data_cnt - 1) {
dbenv->data_cnt *= 2;
if ((dbenv->db_data_dir =
- (char **)realloc(dbenv->db_data_dir,
+ (char **)__db_realloc(dbenv->db_data_dir,
dbenv->data_cnt * sizeof(char **))) == NULL)
goto nomem;
}
@@ -549,7 +555,7 @@ illegal: ret = EINVAL;
} else
goto err;
- if ((*p = (char *)strdup(value)) == NULL) {
+ if ((*p = (char *)__db_strdup(value)) == NULL) {
nomem: ret = ENOMEM;
__db_err(dbenv, "%s", strerror(ENOMEM));
}
@@ -623,7 +629,7 @@ __db_tmp_dir(dbenv, flags)
if (!Special2FSSpec(kTemporaryFolderType,
kOnSystemDisk, 0, &spec)) {
p = FSp2FullPath(&spec);
- sTempFolder = malloc(strlen(p) + 1);
+ sTempFolder = __db_malloc(strlen(p) + 1);
strcpy(sTempFolder, p);
p = sTempFolder;
}
@@ -639,7 +645,7 @@ __db_tmp_dir(dbenv, flags)
if (p == NULL)
return (0);
- if ((dbenv->db_tmp_dir = (char *)strdup(p)) == NULL) {
+ if ((dbenv->db_tmp_dir = (char *)__db_strdup(p)) == NULL) {
__db_err(dbenv, "%s", strerror(ENOMEM));
return (ENOMEM);
}
@@ -722,7 +728,7 @@ __db_tmp_open(dbenv, dir, fdp)
(void)sigprocmask(SIG_BLOCK, &set, &oset);
#endif
#define DB_TEMPOPEN DB_CREATE | DB_EXCL | DB_TEMPORARY
- if ((ret = __db_fdopen(buf,
+ if ((ret = __db_open(buf,
DB_TEMPOPEN, DB_TEMPOPEN, S_IRUSR | S_IWUSR, fdp)) == 0) {
#ifdef HAVE_SIGFILLSET
(void)sigprocmask(SIG_SETMASK, &oset, NULL);
diff --git a/db2/common/db_apprec.c b/db2/common/db_apprec.c
index 2e94673731..ac0176d70f 100644
--- a/db2/common/db_apprec.c
+++ b/db2/common/db_apprec.c
@@ -11,7 +11,7 @@
static const char copyright[] =
"@(#) Copyright (c) 1997\n\
Sleepycat Software Inc. All rights reserved.\n";
-static const char sccsid[] = "@(#)db_apprec.c 10.16 (Sleepycat) 8/27/97";
+static const char sccsid[] = "@(#)db_apprec.c 10.18 (Sleepycat) 9/30/97";
#endif
#ifndef NO_SYSTEM_INCLUDES
@@ -31,12 +31,6 @@ static const char sccsid[] = "@(#)db_apprec.c 10.16 (Sleepycat) 8/27/97";
#include "txn.h"
#include "common_ext.h"
-#define FREE_DBT(L, D) { \
- if (F_ISSET((L), DB_AM_THREAD) && (D).data != NULL) \
- free((D).data); \
- (D).data = NULL; \
- } \
-
/*
* __db_apprec --
* Perform recovery.
@@ -52,34 +46,41 @@ __db_apprec(dbenv, flags)
DB_LOG *lp;
DB_LSN ckp_lsn, first_lsn, lsn, tmp_lsn;
time_t now;
- int first_flag, ret;
+ int first_flag, is_thread, ret;
void *txninfo;
+ lp = dbenv->lg_info;
+
/* Initialize the transaction list. */
if ((ret = __db_txnlist_init(&txninfo)) != 0)
return (ret);
/*
+ * Save the state of the thread flag -- we don't need it on at the
+ * moment because we're single-threaded until recovery is complete.
+ */
+ is_thread = F_ISSET(lp, DB_AM_THREAD);
+ F_CLR(lp, DB_AM_THREAD);
+
+ /*
* Read forward through the log, opening the appropriate files so that
* we can call recovery routines. In general, we start at the last
* checkpoint prior to the last checkpointed LSN. For catastrophic
* recovery, we begin at the first LSN that appears in any log file
* (log_get figures this out for us when we pass it the DB_FIRST flag).
*/
- lp = dbenv->lg_info;
if (LF_ISSET(DB_RECOVER_FATAL))
first_flag = DB_FIRST;
else {
- if ((ret = __log_findckp(lp, &lsn)) == DB_NOTFOUND)
+ if ((ret = __log_findckp(lp, &lsn)) == DB_NOTFOUND) {
+ F_SET(lp, is_thread);
return (0);
+ }
first_flag = DB_SET;
}
/* If we're a threaded application, we have to allocate space. */
memset(&data, 0, sizeof(data));
- if (F_ISSET(lp, DB_AM_THREAD))
- F_SET(&data, DB_DBT_MALLOC);
-
if ((ret = log_get(lp, &lsn, &data, first_flag)) != 0) {
__db_err(dbenv, "Failure: unable to get log record");
if (first_flag == DB_SET)
@@ -93,7 +94,6 @@ __db_apprec(dbenv, flags)
first_lsn = lsn;
for (;;) {
ret = __db_dispatch(lp, &data, &lsn, TXN_OPENFILES, txninfo);
- FREE_DBT(lp, data);
if (ret != 0 && ret != DB_TXN_CKP)
goto msgerr;
if ((ret =
@@ -103,7 +103,6 @@ __db_apprec(dbenv, flags)
break;
}
}
- FREE_DBT(lp, data);
/*
* Initialize the ckp_lsn to 0,0. If we never find a valid
@@ -116,7 +115,6 @@ __db_apprec(dbenv, flags)
tmp_lsn = lsn;
ret = __db_dispatch(lp,
&data, &lsn, TXN_BACKWARD_ROLL, txninfo);
- FREE_DBT(lp, data);
if (ret == DB_TXN_CKP) {
if (IS_ZERO_LSN(ckp_lsn))
ckp_lsn = tmp_lsn;
@@ -124,20 +122,17 @@ __db_apprec(dbenv, flags)
} else if (ret != 0)
goto msgerr;
}
- FREE_DBT(lp, data);
if (ret != 0 && ret != DB_NOTFOUND)
goto err;
for (ret = log_get(lp, &lsn, &data, DB_NEXT);
ret == 0; ret = log_get(lp, &lsn, &data, DB_NEXT)) {
ret = __db_dispatch(lp, &data, &lsn, TXN_FORWARD_ROLL, txninfo);
- FREE_DBT(lp, data);
if (ret == DB_TXN_CKP)
ret = 0;
else if (ret != 0)
goto msgerr;
}
- FREE_DBT(lp, data);
if (ret != DB_NOTFOUND)
goto err;
@@ -165,11 +160,12 @@ __db_apprec(dbenv, flags)
(u_long)dbenv->tx_info->region->last_ckp.offset);
}
+ F_SET(lp, is_thread);
return (0);
msgerr: __db_err(dbenv, "Recovery function for LSN %lu %lu failed",
(u_long)lsn.file, (u_long)lsn.offset);
-err: FREE_DBT(lp, data);
+err: F_SET(lp, is_thread);
return (ret);
}
diff --git a/db2/common/db_byteorder.c b/db2/common/db_byteorder.c
index a8d7715455..e486132073 100644
--- a/db2/common/db_byteorder.c
+++ b/db2/common/db_byteorder.c
@@ -8,20 +8,20 @@
#include "config.h"
#ifndef lint
-static const char sccsid[] = "@(#)db_byteorder.c 10.3 (Sleepycat) 6/21/97";
+static const char sccsid[] = "@(#)db_byteorder.c 10.4 (Sleepycat) 9/4/97";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
-#include <errno.h>
+#ifdef HAVE_ENDIAN_H
+#include <endian.h>
+#if BYTE_ORDER == BIG_ENDIAN
+#define WORDS_BIGENDIAN 1
+#endif
#endif
-#ifdef HAVE_ENDIAN_H
-# include <endian.h>
-# if BYTE_ORDER == BIG_ENDIAN
-# define WORDS_BIGENDIAN 1
-# endif
+#include <errno.h>
#endif
#include "db_int.h"
diff --git a/db2/common/db_region.c b/db2/common/db_region.c
index 86d79a8148..3e8cd2dc66 100644
--- a/db2/common/db_region.c
+++ b/db2/common/db_region.c
@@ -43,7 +43,7 @@
#include "config.h"
#ifndef lint
-static const char sccsid[] = "@(#)db_region.c 10.13 (Sleepycat) 8/27/97";
+static const char sccsid[] = "@(#)db_region.c 10.15 (Sleepycat) 10/25/97";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
@@ -114,7 +114,7 @@ __db_rcreate(dbenv, appname, path, file, mode, size, fdp, retp)
* attempts to create the region will return failure in one of the
* attempts.
*/
- if (fd == -1 && (ret = __db_fdopen(name,
+ if (fd == -1 && (ret = __db_open(name,
DB_CREATE | DB_EXCL, DB_CREATE | DB_EXCL, mode, &fd)) != 0) {
if (ret != EEXIST)
__db_err(dbenv,
@@ -131,6 +131,42 @@ __db_rcreate(dbenv, appname, path, file, mode, size, fdp, retp)
if ((ret = __db_rmap(dbenv, fd, size, &rp)) != 0)
goto err;
+ /* Initialize the region. */
+ if ((ret = __db_rinit(dbenv, rp, fd, size, 1)) != 0)
+ goto err;
+
+ if (name != NULL)
+ FREES(name);
+
+ *(void **)retp = rp;
+ return (0);
+
+err: if (fd != -1) {
+ if (rp != NULL)
+ (void)__db_unmap(rp, rp->size);
+ (void)__db_unlink(name);
+ (void)__db_close(fd);
+ }
+ if (name != NULL)
+ FREES(name);
+ return (ret);
+}
+
+/*
+ * __db_rinit --
+ * Initialize the region.
+ *
+ * PUBLIC: int __db_rinit __P((DB_ENV *, RLAYOUT *, int, size_t, int));
+ */
+int
+__db_rinit(dbenv, rp, fd, size, lock_region)
+ DB_ENV *dbenv;
+ RLAYOUT *rp;
+ size_t size;
+ int fd, lock_region;
+{
+ int ret;
+
/*
* Initialize the common information.
*
@@ -141,9 +177,12 @@ __db_rcreate(dbenv, appname, path, file, mode, size, fdp, retp)
* file permissions games, but we can't because WNT filesystems won't
* open a file mode 0.
*
- * So, the process that's creating the region always acquires the lock
- * before the setting the version number. Any process joining always
- * checks the version number before attempting to acquire the lock.
+ * If the lock_region flag is set, the process creating the region
+ * acquires the lock before the setting the version number. Any
+ * process joining the region checks the version number before
+ * attempting to acquire the lock. (The lock_region flag may not be
+ * set -- the mpool code sometimes malloc's private regions but still
+ * needs to initialize them, specifically, the mutex for threads.)
*
* We have to check the version number first, because if the version
* number has not been written, it's possible that the mutex has not
@@ -151,30 +190,16 @@ __db_rcreate(dbenv, appname, path, file, mode, size, fdp, retp)
* random behavior. If the version number isn't there (the file size
* is too small) or it's 0, we know that the region is being created.
*/
- (void)__db_mutex_init(&rp->lock, MUTEX_LOCK_OFFSET(rp, &rp->lock));
- (void)__db_mutex_lock(&rp->lock,
- fd, dbenv == NULL ? NULL : dbenv->db_yield);
+ __db_mutex_init(&rp->lock, MUTEX_LOCK_OFFSET(rp, &rp->lock));
+ if (lock_region && (ret = __db_mutex_lock(&rp->lock, fd)) != 0)
+ return (ret);
rp->refcnt = 1;
rp->size = size;
rp->flags = 0;
db_version(&rp->majver, &rp->minver, &rp->patch);
- if (name != NULL)
- FREES(name);
-
- *(void **)retp = rp;
return (0);
-
-err: if (fd != -1) {
- if (rp != NULL)
- (void)__db_munmap(rp, rp->size);
- (void)__db_unlink(name);
- (void)__db_close(fd);
- }
- if (name != NULL)
- FREES(name);
- return (ret);
}
/*
@@ -205,7 +230,7 @@ __db_ropen(dbenv, appname, path, file, flags, fdp, retp)
return (ret);
/* Open the file. */
- if ((ret = __db_fdopen(name, flags, DB_MUTEXDEBUG, 0, &fd)) != 0) {
+ if ((ret = __db_open(name, flags, DB_MUTEXDEBUG, 0, &fd)) != 0) {
__db_err(dbenv, "region open: %s: %s", name, strerror(ret));
goto err2;
}
@@ -225,8 +250,10 @@ __db_ropen(dbenv, appname, path, file, flags, fdp, retp)
* flatly impossible. Hope that mmap fails if the file is too large.
*
*/
- if ((ret = __db_stat(dbenv, name, fd, &size1, NULL)) != 0)
+ if ((ret = __db_ioinfo(name, fd, &size1, NULL)) != 0) {
+ __db_err(dbenv, "%s: %s", name, strerror(ret));
goto err2;
+ }
/* Check to make sure the first block has been written. */
if ((size_t)size1 < sizeof(RLAYOUT)) {
@@ -249,16 +276,17 @@ __db_ropen(dbenv, appname, path, file, flags, fdp, retp)
/* Get the region lock. */
if (!LF_ISSET(DB_MUTEXDEBUG))
- (void)__db_mutex_lock(&rp->lock,
- fd, dbenv == NULL ? NULL : dbenv->db_yield);
+ (void)__db_mutex_lock(&rp->lock, fd);
/*
* The file may have been half-written if we were descheduled between
* getting the size of the file and checking the major version. Check
* to make sure we got the entire file.
*/
- if ((ret = __db_stat(dbenv, name, fd, &size2, NULL)) != 0)
+ if ((ret = __db_ioinfo(name, fd, &size2, NULL)) != 0) {
+ __db_err(dbenv, "%s: %s", name, strerror(ret));
goto err1;
+ }
if (size1 != size2) {
ret = EAGAIN;
goto err1;
@@ -285,7 +313,7 @@ __db_ropen(dbenv, appname, path, file, flags, fdp, retp)
err1: if (!LF_ISSET(DB_MUTEXDEBUG))
(void)__db_mutex_unlock(&rp->lock, fd);
err2: if (rp != NULL)
- (void)__db_munmap(rp, rp->size);
+ (void)__db_unmap(rp, rp->size);
if (fd != -1)
(void)__db_close(fd);
FREES(name);
@@ -312,8 +340,7 @@ __db_rclose(dbenv, fd, ptr)
fail = NULL;
/* Get the lock. */
- if ((ret = __db_mutex_lock(&rp->lock,
- fd, dbenv == NULL ? NULL : dbenv->db_yield)) != 0) {
+ if ((ret = __db_mutex_lock(&rp->lock, fd)) != 0) {
fail = "lock get";
goto err;
}
@@ -328,7 +355,7 @@ __db_rclose(dbenv, fd, ptr)
}
/* Discard the region. */
- if ((t_ret = __db_munmap(ptr, rp->size)) != 0 && fail == NULL) {
+ if ((t_ret = __db_unmap(ptr, rp->size)) != 0 && fail == NULL) {
ret = t_ret;
fail = "munmap";
}
@@ -392,8 +419,7 @@ __db_runlink(dbenv, appname, path, file, force)
/* Open and lock the region. */
if ((ret = __db_ropen(dbenv, appname, path, file, 0, &fd, &rp)) != 0)
goto err1;
- (void)__db_mutex_lock(&rp->lock,
- fd, dbenv == NULL ? NULL : dbenv->db_yield);
+ (void)__db_mutex_lock(&rp->lock, fd);
/* If the region is currently being deleted, fail. */
if (F_ISSET(rp, DB_R_DELETED)) {
@@ -434,8 +460,7 @@ __db_runlink(dbenv, appname, path, file, force)
/* Not a clue. Try to clear the DB_R_DELETED flag. */
if ((ret = __db_ropen(dbenv, appname, path, file, 0, &fd, &rp)) != 0)
goto err1;
- (void)__db_mutex_lock(&rp->lock,
- fd, dbenv == NULL ? NULL : dbenv->db_yield);
+ (void)__db_mutex_lock(&rp->lock, fd);
F_CLR(rp, DB_R_DELETED);
/* FALLTHROUGH */
@@ -472,7 +497,7 @@ __db_rgrow(dbenv, fd, incr)
char buf[__DB_VMPAGESIZE];
/* Seek to the end of the region. */
- if ((ret = __db_lseek(fd, 0, 0, 0, SEEK_END)) != 0)
+ if ((ret = __db_seek(fd, 0, 0, 0, SEEK_END)) != 0)
goto err;
/* Write nuls to the new bytes. */
@@ -500,7 +525,7 @@ __db_rgrow(dbenv, fd, incr)
incr -= incr % __DB_VMPAGESIZE;
/* Write the last page, not the page after the last. */
- if ((ret = __db_lseek(fd, 0, 0, incr - __DB_VMPAGESIZE, SEEK_CUR)) != 0)
+ if ((ret = __db_seek(fd, 0, 0, incr - __DB_VMPAGESIZE, SEEK_CUR)) != 0)
goto err;
if ((ret = __db_write(fd, buf, sizeof(buf), &nw)) != 0)
goto err;
@@ -531,7 +556,7 @@ __db_rremap(dbenv, ptr, oldsize, newsize, fd, retp)
{
int ret;
- if ((ret = __db_munmap(ptr, oldsize)) != 0) {
+ if ((ret = __db_unmap(ptr, oldsize)) != 0) {
__db_err(dbenv, "region remap: munmap: %s", strerror(ret));
return (ret);
}
@@ -553,7 +578,7 @@ __db_rmap(dbenv, fd, size, retp)
RLAYOUT *rp;
int ret;
- if ((ret = __db_mmap(fd, size, 0, 0, &rp)) != 0) {
+ if ((ret = __db_map(fd, size, 0, 0, (void **)&rp)) != 0) {
__db_err(dbenv, "region map: mmap %s", strerror(ret));
return (ret);
}