summaryrefslogtreecommitdiff
path: root/rpmdb/db3.c
diff options
context:
space:
mode:
Diffstat (limited to 'rpmdb/db3.c')
-rw-r--r--rpmdb/db3.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/rpmdb/db3.c b/rpmdb/db3.c
index 604e63578..86005d7b0 100644
--- a/rpmdb/db3.c
+++ b/rpmdb/db3.c
@@ -191,13 +191,13 @@ static int db_fini(dbiIndex dbi, const char * dbhome,
/*@-moduncon@*/ /* FIX: annotate db3 methods */
xx = db_env_create(&dbenv, 0);
/*@=moduncon@*/
- xx = cvtdberr(dbi, "db_env_create", rc, _debug);
+ xx = cvtdberr(dbi, "db_env_create", xx, _debug);
#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR != 0) || (DB_VERSION_MAJOR == 4)
xx = dbenv->remove(dbenv, dbhome, 0);
#else
xx = dbenv->remove(dbenv, dbhome, NULL, 0);
#endif
- xx = cvtdberr(dbi, "dbenv->remove", rc, _debug);
+ xx = cvtdberr(dbi, "dbenv->remove", xx, _debug);
if (dbfile)
rpmMessage(RPMMESS_DEBUG, _("removed db environment %s/%s\n"),
@@ -218,6 +218,10 @@ static int db3_fsync_disable(/*@unused@*/ int fd)
#include <pthread.h>
#endif
+/**
+ * Check that posix mutexes are shared.
+ * @return 0 == shared.
+ */
static int db3_pthread_nptl(void)
/*@*/
{
@@ -291,12 +295,6 @@ static int db_init(dbiIndex dbi, const char * dbhome,
if (dbi->dbi_host == NULL)
dbi->dbi_ecflags &= ~DB_CLIENT;
-#if HAVE_LIBPTHREAD
- /* XXX Set DB_ENV_PRIVATE if not nptl. */
- if (db3_pthread_nptl())
- dbi->dbi_ecflags |= DB_ENV_PRIVATE;
-#endif
-
/* XXX Set a default shm_key. */
if ((dbi->dbi_eflags & DB_SYSTEM_MEM) && dbi->dbi_shmkey == 0) {
#if defined(HAVE_FTOK)
@@ -308,12 +306,9 @@ static int db_init(dbiIndex dbi, const char * dbhome,
rc = db_env_create(&dbenv, dbi->dbi_ecflags);
rc = cvtdberr(dbi, "db_env_create", rc, _debug);
- if (rc)
+ if (dbenv == NULL || rc)
goto errxit;
- if (dbenv == NULL)
- return 1;
-
{ int xx;
/*@-noeffectuncon@*/ /* FIX: annotate db3 methods */
@@ -407,7 +402,7 @@ static int db_init(dbiIndex dbi, const char * dbhome,
tmpdir = rpmGenPath(root, dbi->dbi_tmpdir, NULL);
/*@=mods@*/
xx = dbenv->set_tmp_dir(dbenv, tmpdir);
- xx = cvtdberr(dbi, "dbenv->set_tmp_dir", rc, _debug);
+ xx = cvtdberr(dbi, "dbenv->set_tmp_dir", xx, _debug);
tmpdir = _free(tmpdir);
}
}
@@ -964,6 +959,14 @@ static int db3open(rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
* Avoid incompatible DB_CREATE/DB_RDONLY flags on DBENV->open.
*/
if (dbi->dbi_use_dbenv) {
+
+#if HAVE_LIBPTHREAD
+ /* Set DB_PRIVATE if posix mutexes are not shared. */
+ if (db3_pthread_nptl()) {
+ dbi->dbi_eflags |= DB_PRIVATE;
+ }
+#endif
+
if (access(dbhome, W_OK) == -1) {
/* dbhome is unwritable, don't attempt DB_CREATE on DB->open ... */
@@ -1297,7 +1300,7 @@ static int db3open(rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
/* Warning iff using non-private CDB locking. */
rc = ((dbi->dbi_use_dbenv &&
(dbi->dbi_eflags & DB_INIT_CDB) &&
- !(dbi->dbi_ecflags & DB_ENV_PRIVATE))
+ !(dbi->dbi_eflags & DB_PRIVATE))
? 0 : 1);
rpmError( (rc ? RPMERR_FLOCK : RPMWARN_FLOCK),
_("cannot get %s lock on %s/%s\n"),