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>
This commit is contained in:
Nagy Gabor 2009-05-16 16:54:21 +02:00 committed by Dan McGee
parent 1b4135ca5d
commit c520d38451
3 changed files with 25 additions and 13 deletions

View File

@ -276,7 +276,8 @@ typedef enum _pmtransflag_t {
PM_TRANS_FLAG_NEEDED = 0x2000, PM_TRANS_FLAG_NEEDED = 0x2000,
PM_TRANS_FLAG_ALLEXPLICIT = 0x4000, PM_TRANS_FLAG_ALLEXPLICIT = 0x4000,
PM_TRANS_FLAG_UNNEEDED = 0x8000, PM_TRANS_FLAG_UNNEEDED = 0x8000,
PM_TRANS_FLAG_RECURSEALL = 0x10000 PM_TRANS_FLAG_RECURSEALL = 0x10000,
PM_TRANS_FLAG_NOLOCK = 0x20000
} pmtransflag_t; } pmtransflag_t;
/** /**
@ -487,6 +488,7 @@ enum _pmerrno_t {
PM_ERR_TRANS_NOT_PREPARED, PM_ERR_TRANS_NOT_PREPARED,
PM_ERR_TRANS_ABORT, PM_ERR_TRANS_ABORT,
PM_ERR_TRANS_TYPE, PM_ERR_TRANS_TYPE,
PM_ERR_TRANS_NOT_LOCKED,
/* Packages */ /* Packages */
PM_ERR_PKG_NOT_FOUND, PM_ERR_PKG_NOT_FOUND,
PM_ERR_PKG_IGNORED, PM_ERR_PKG_IGNORED,

View File

@ -99,6 +99,8 @@ const char SYMEXPORT *alpm_strerror(int err)
return _("transaction aborted"); return _("transaction aborted");
case PM_ERR_TRANS_TYPE: case PM_ERR_TRANS_TYPE:
return _("operation not compatible with the transaction 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 */ /* Packages */
case PM_ERR_PKG_NOT_FOUND: case PM_ERR_PKG_NOT_FOUND:
return _("could not find or read package"); return _("could not find or read package");

View File

@ -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)); ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1));
/* lock db */ /* lock db */
handle->lckfd = _alpm_lckmk(); if(!(flags & PM_TRANS_FLAG_NOLOCK)) {
if(handle->lckfd == -1) { handle->lckfd = _alpm_lckmk();
RET_ERR(PM_ERR_HANDLE_LOCK, -1); if(handle->lckfd == -1) {
RET_ERR(PM_ERR_HANDLE_LOCK, -1);
}
} }
handle->trans = _alpm_trans_new(); 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 != 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->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)); 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 != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
ASSERT(trans->state != STATE_IDLE, 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); _alpm_trans_free(trans);
handle->trans = NULL; handle->trans = NULL;
/* unlock db */ /* unlock db */
if(handle->lckfd != -1) { if(!nolock_flag) {
while(close(handle->lckfd) == -1 && errno == EINTR); if(handle->lckfd != -1) {
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"), if(_alpm_lckrm()) {
alpm_option_get_lockfile()); _alpm_log(PM_LOG_WARNING, _("could not remove lock file %s\n"),
alpm_logaction("warning: could not remove lock file %s\n", alpm_option_get_lockfile());
alpm_option_get_lockfile()); alpm_logaction("warning: could not remove lock file %s\n",
alpm_option_get_lockfile());
}
} }
return(0); return(0);