summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNagy Gabor <ngaba@bibl.u-szeged.hu>2009-05-16 16:54:21 +0200
committerDan McGee <dan@archlinux.org>2009-06-01 22:00:57 -0500
commitc520d3845113ce4dc1a473c012288da7f2a655b8 (patch)
tree2595ce5d5b2c1ab667bd0bf0aa9251d52ce2bd4c
parent1b4135ca5d0654d18398d648ba48ecf14caa2289 (diff)
Introduce PM_TRANS_FLAG_NOLOCK
This flag indicates that the front-end will not call alpm_trans_commit(), so the database needn't be locked. This is the first step toward fixing FS#8905. If this flag is set, alpm_trans_commit() does nothing and returns with an error (that has new code: PM_ERR_TRANS_NOT_LOCKED). Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu> Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/alpm.h4
-rw-r--r--lib/libalpm/error.c2
-rw-r--r--lib/libalpm/trans.c32
3 files changed, 25 insertions, 13 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 57ea8806..5cf1e940 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -276,7 +276,8 @@ typedef enum _pmtransflag_t {
PM_TRANS_FLAG_NEEDED = 0x2000,
PM_TRANS_FLAG_ALLEXPLICIT = 0x4000,
PM_TRANS_FLAG_UNNEEDED = 0x8000,
- PM_TRANS_FLAG_RECURSEALL = 0x10000
+ PM_TRANS_FLAG_RECURSEALL = 0x10000,
+ PM_TRANS_FLAG_NOLOCK = 0x20000
} pmtransflag_t;
/**
@@ -487,6 +488,7 @@ enum _pmerrno_t {
PM_ERR_TRANS_NOT_PREPARED,
PM_ERR_TRANS_ABORT,
PM_ERR_TRANS_TYPE,
+ PM_ERR_TRANS_NOT_LOCKED,
/* Packages */
PM_ERR_PKG_NOT_FOUND,
PM_ERR_PKG_IGNORED,
diff --git a/lib/libalpm/error.c b/lib/libalpm/error.c
index 47f07508..fdff9ed4 100644
--- a/lib/libalpm/error.c
+++ b/lib/libalpm/error.c
@@ -99,6 +99,8 @@ const char SYMEXPORT *alpm_strerror(int err)
return _("transaction aborted");
case PM_ERR_TRANS_TYPE:
return _("operation not compatible with the transaction type");
+ case PM_ERR_TRANS_NOT_LOCKED:
+ return _("transaction commit attempt when database is not locked");
/* Packages */
case PM_ERR_PKG_NOT_FOUND:
return _("could not find or read package");
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index ef568411..64bec84e 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -71,9 +71,11 @@ int SYMEXPORT alpm_trans_init(pmtranstype_t type, pmtransflag_t flags,
ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1));
/* lock db */
- handle->lckfd = _alpm_lckmk();
- if(handle->lckfd == -1) {
- RET_ERR(PM_ERR_HANDLE_LOCK, -1);
+ if(!(flags & PM_TRANS_FLAG_NOLOCK)) {
+ handle->lckfd = _alpm_lckmk();
+ if(handle->lckfd == -1) {
+ RET_ERR(PM_ERR_HANDLE_LOCK, -1);
+ }
}
handle->trans = _alpm_trans_new();
@@ -158,6 +160,8 @@ int SYMEXPORT alpm_trans_commit(alpm_list_t **data)
ASSERT(handle->trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
ASSERT(handle->trans->state == STATE_PREPARED, RET_ERR(PM_ERR_TRANS_NOT_PREPARED, -1));
+ ASSERT(!(handle->trans->flags & PM_TRANS_FLAG_NOLOCK), RET_ERR(PM_ERR_TRANS_NOT_LOCKED, -1));
+
return(_alpm_trans_commit(handle->trans, data));
}
@@ -199,19 +203,23 @@ int SYMEXPORT alpm_trans_release()
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
ASSERT(trans->state != STATE_IDLE, RET_ERR(PM_ERR_TRANS_NULL, -1));
+ unsigned int nolock_flag = trans->flags & PM_TRANS_FLAG_NOLOCK;
+
_alpm_trans_free(trans);
handle->trans = NULL;
/* unlock db */
- if(handle->lckfd != -1) {
- while(close(handle->lckfd) == -1 && errno == EINTR);
- handle->lckfd = -1;
- }
- if(_alpm_lckrm()) {
- _alpm_log(PM_LOG_WARNING, _("could not remove lock file %s\n"),
- alpm_option_get_lockfile());
- alpm_logaction("warning: could not remove lock file %s\n",
- alpm_option_get_lockfile());
+ if(!nolock_flag) {
+ if(handle->lckfd != -1) {
+ while(close(handle->lckfd) == -1 && errno == EINTR);
+ handle->lckfd = -1;
+ }
+ if(_alpm_lckrm()) {
+ _alpm_log(PM_LOG_WARNING, _("could not remove lock file %s\n"),
+ alpm_option_get_lockfile());
+ alpm_logaction("warning: could not remove lock file %s\n",
+ alpm_option_get_lockfile());
+ }
}
return(0);