[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