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