[pacman-dev] [PATCH 1/2] Introduce PM_TRANS_FLAG_NOLOCK

Dan McGee dpmcgee at gmail.com
Mon May 18 23:50:10 EDT 2009


On Sat, May 16, 2009 at 11:24 AM, Nagy Gabor <ngaba at bibl.u-szeged.hu> wrote:
> >From afa07db77af2896b407b24c6ef69bb19f6b80417 Mon Sep 17 00:00:00 2001
> From: Nagy Gabor <ngaba at bibl.u-szeged.hu>
> Date: Sat, 16 May 2009 16:54:21 +0200
> Subject: [PATCH 1/2] 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 at bibl.u-szeged.hu>

I think this makes sense (in addition with the next patch). Anyone
else care to chime in?

> ---
>  lib/libalpm/alpm.h  |    4 +++-
>  lib/libalpm/error.c |    2 ++
>  lib/libalpm/trans.c |   32 ++++++++++++++++++++------------
>  3 files changed, 25 insertions(+), 13 deletions(-)
>
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index 2a6c2e0..1e22a59 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 47f0750..fdff9ed 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 b144b2a..6e74f3f 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));
>
> +       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);
> --
> 1.6.3.1
>
> _______________________________________________
> pacman-dev mailing list
> pacman-dev at archlinux.org
> http://www.archlinux.org/mailman/listinfo/pacman-dev
>


More information about the pacman-dev mailing list