bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH 6/7] libdiskfs: lock-less reference counting for peropen obje


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

Justus Winter, le Tue 13 May 2014 21:02:55 +0200, a écrit :
> * libdiskfs/diskfs.h (struct peropen): Use refcount_t for field refcnt.
> * libdiskfs/peropen-make.c (diskfs_make_peropen): Initialize refcnt.
> * libdiskfs/peropen-rele.c (diskfs_release_peropen): Adjust accordingly.
> * libdiskfs/protid-make.c (diskfs_start_protid): Likewise.  Also, the
> node must no longer be locked, adjust comment accordingly.
> (diskfs_create_protid): Likewise.

Ack.

> ---
>  libdiskfs/diskfs.h       |  7 ++++---
>  libdiskfs/peropen-make.c |  2 +-
>  libdiskfs/peropen-rele.c | 21 ++++++++++-----------
>  libdiskfs/protid-make.c  |  8 ++++----
>  4 files changed, 19 insertions(+), 19 deletions(-)
> 
> diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h
> index 8151ddc..ae1a150 100644
> --- a/libdiskfs/diskfs.h
> +++ b/libdiskfs/diskfs.h
> @@ -28,6 +28,7 @@
>  #include <hurd/iohelp.h>
>  #include <idvec.h>
>  #include <features.h>
> +#include <refcount.h>
>  
>  #ifdef DISKFS_DEFINE_EXTERN_INLINE
>  #define DISKFS_EXTERN_INLINE
> @@ -57,7 +58,7 @@ struct peropen
>  {
>    int filepointer;
>    int lock_status;
> -  int refcnt;
> +  refcount_t refcnt;
>    int openstat;
>  
>    struct node *np;
> @@ -792,12 +793,12 @@ diskfs_create_node (struct node *dir, const char *name, 
> mode_t mode,
>                   struct dirstat *ds);
>  
>  /* Create and return a protid for an existing peropen PO in CRED,
> -   referring to user USER.  The node PO->np must be locked. */
> +   referring to user USER.  */
>  error_t diskfs_create_protid (struct peropen *po, struct iouser *user,
>                             struct protid **cred);
>  
>  /* Build and return in CRED a protid which has no user identification, for
> -   peropen PO.  The node PO->np must be locked.  */
> +   peropen PO.  */
>  error_t diskfs_start_protid (struct peropen *po, struct protid **cred);
>  
>  /* Finish building protid CRED started with diskfs_start_protid;
> diff --git a/libdiskfs/peropen-make.c b/libdiskfs/peropen-make.c
> index eba037f..6d5ca01 100644
> --- a/libdiskfs/peropen-make.c
> +++ b/libdiskfs/peropen-make.c
> @@ -31,7 +31,7 @@ diskfs_make_peropen (struct node *np, int flags, struct 
> peropen *context,
>  
>    po->filepointer = 0;
>    po->lock_status = LOCK_UN;
> -  po->refcnt = 0;
> +  refcount_init (&po->refcnt, 0);
>    po->openstat = flags;
>    po->np = np;
>    po->path = NULL;
> diff --git a/libdiskfs/peropen-rele.c b/libdiskfs/peropen-rele.c
> index d3f7492..877137b 100644
> --- a/libdiskfs/peropen-rele.c
> +++ b/libdiskfs/peropen-rele.c
> @@ -22,13 +22,8 @@
>  void
>  diskfs_release_peropen (struct peropen *po)
>  {
> -  pthread_mutex_lock (&po->np->lock);
> -
> -  if (--po->refcnt)
> -    {
> -      pthread_mutex_unlock (&po->np->lock);
> -      return;
> -    }
> +  if (refcount_deref (&po->refcnt) > 0)
> +    return;
>  
>    if (po->root_parent)
>      mach_port_deallocate (mach_task_self (), po->root_parent);
> @@ -40,10 +35,14 @@ diskfs_release_peropen (struct peropen *po)
>      mach_port_deallocate (mach_task_self (), po->shadow_root_parent);
>  
>    if (po->lock_status != LOCK_UN)
> -    fshelp_acquire_lock (&po->np->userlock, &po->lock_status,
> -                      &po->np->lock, LOCK_UN);
> -
> -  diskfs_nput (po->np);
> +    {
> +      pthread_mutex_lock (&po->np->lock);
> +      fshelp_acquire_lock (&po->np->userlock, &po->lock_status,
> +                           &po->np->lock, LOCK_UN);
> +      diskfs_nput (po->np);
> +    }
> +  else
> +    diskfs_nrele (po->np);
>  
>    free (po->path);
>    free (po);
> diff --git a/libdiskfs/protid-make.c b/libdiskfs/protid-make.c
> index b39b92a..22aaa2e 100644
> --- a/libdiskfs/protid-make.c
> +++ b/libdiskfs/protid-make.c
> @@ -20,7 +20,7 @@
>  #include <assert.h>
>  
>  /* Build and return in CRED a protid which has no user identification, for
> -   peropen PO.  The node PO->np must be locked.  */
> +   peropen PO.  */
>  error_t
>  diskfs_start_protid (struct peropen *po, struct protid **cred)
>  {
> @@ -29,7 +29,7 @@ diskfs_start_protid (struct peropen *po, struct protid 
> **cred)
>                                sizeof (struct protid), cred);
>    if (! err)
>      {
> -      po->refcnt++;
> +      refcount_ref (&po->refcnt);
>        (*cred)->po = po;
>        (*cred)->shared_object = MACH_PORT_NULL;
>        (*cred)->mapped = 0;
> @@ -55,8 +55,8 @@ diskfs_finish_protid (struct protid *cred, struct iouser 
> *user)
>    assert_perror (err);
>  }
>  
> -/* Create and return a protid for an existing peropen PO in CRED for USER.
> -   The node PO->np must be locked. */
> +/* Create and return a protid for an existing peropen PO in CRED for
> +   USER.  */
>  error_t
>  diskfs_create_protid (struct peropen *po, struct iouser *user,
>                     struct protid **cred)
> -- 
> 2.0.0.rc0
> 

-- 
Samuel
Hi ! I'm a .signature virus ! Copy me into your ~/.signature, please !



reply via email to

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