bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 7/7] libtrivfs: lock-less reference counting for trivfs_perop


From: Samuel Thibault
Subject: Re: [PATCH 7/7] libtrivfs: lock-less reference counting for trivfs_peropen objects
Date: Fri, 23 May 2014 01:40:19 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Tue 13 May 2014 21:02:56 +0200, a écrit :
> diff --git a/libtrivfs/protid-clean.c b/libtrivfs/protid-clean.c
> index f98da6a..cce736d 100644
> --- a/libtrivfs/protid-clean.c
> +++ b/libtrivfs/protid-clean.c
> @@ -31,19 +31,23 @@ trivfs_clean_protid (void *arg)
>      (*trivfs_protid_destroy_hook) (cred);
>  
>    /* If we hold the only reference to the peropen, try to get rid of it. */
> -  pthread_mutex_lock (&cntl->lock);
> -  if (cred->po->refcnt == 1 && trivfs_peropen_destroy_hook)
> +  if (refcount_deref (&cred->po->refcnt) == 0)
>      {
> -      pthread_mutex_unlock (&cntl->lock);
> -      (*trivfs_peropen_destroy_hook) (cred->po);
> -      pthread_mutex_lock (&cntl->lock);
> +      if (trivfs_peropen_destroy_hook)
> +        {
> +          /* Reaquire a reference while we call the hook.  */
> +          refcount_ref (&cred->po->refcnt);
> +          (*trivfs_peropen_destroy_hook) (cred->po);
> +          if (refcount_deref (&cred->po->refcnt) == 0)
> +            goto free_po;
> +        }
> +      else
> +        {
> +        free_po:
> +          ports_port_deref (cntl);
> +          free (cred->po);
> +        }

Why not doing it as before: check whether it's the last reference,
instead of unreferencing, then re-referencing for the hook, and
unreference again?

Samuel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]