All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Liu Ping Fan <qemulist@gmail.com>
Cc: qemu-devel@nongnu.org, Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH 1/2] object: introduce Qref to abstract the refcnt interface
Date: Mon, 15 Jul 2013 13:38:35 +0200	[thread overview]
Message-ID: <51E3DF3B.5040409@redhat.com> (raw)
In-Reply-To: <1373856556-22272-1-git-send-email-pingfank@linux.vnet.ibm.com>

Il 15/07/2013 04:49, Liu Ping Fan ha scritto:
> Qref is similar to kref. It hides the refcnt detail and provides
> a common interface. And this patch is based on the idiom of refcnt,
> and adopts some optimization about memory model, which finally
> falls back on gcc implementation.
> 
> Signed-off-by: Liu Ping Fan <pingfank@linux.vnet.ibm.com>
> ---
>  include/qom/object.h | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 23fc048..2e165fb 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -18,6 +18,7 @@
>  #include <stdint.h>
>  #include <stdbool.h>
>  #include "qemu/queue.h"
> +#include "qemu/osdep.h"
>  
>  struct Visitor;
>  struct Error;
> @@ -363,6 +364,10 @@ struct ObjectClass
>      ObjectUnparent *unparent;
>  };
>  
> +typedef struct Qref {
> +    int32_t count;
> +} Qref;
> +
>  /**
>   * Object:
>   *
> @@ -1133,5 +1138,34 @@ int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque),
>   */
>  Object *container_get(Object *root, const char *path);
>  
> +static inline void qref_get(Qref *qref)
> +{
> +#ifdef __ATOMIC_RELAXED
> +    __atomic_fetch_add(&qref->count, 1, __ATOMIC_RELAXED);
> +#else
> +    __sync_fetch_and_add(&qref->count, 1);
> +#endif
> +}
> +
> +typedef void (*ReleaseFn)(Qref *);
>  
> +static inline void qref_put(Qref *qref, ReleaseFn release)
> +{
> +    int32_t i;
> +
> +#ifdef __ATOMIC_RELAXED
> +    i = __atomic_fetch_add(&qref->count, -1, __ATOMIC_RELAXED);
> +    g_assert(i > 0);
> +    if (unlikely(i == 1)) {
> +        __atomic_thread_fence(__ATOMIC_SEQ_CST);
> +        release(qref);
> +    }
> +#else
> +    i = __sync_fetch_and_add(&qref->count, -1);
> +    g_assert(i > 0);
> +    if (unlikely(i == 1)) {
> +        release(qref);
> +    }
> +#endif
> +}
>  #endif
> 

I don't think this should depend on QOM, so include/qom/object.h is not
the right place to put it.  I suggested a different way in the other thread.

Also, get/put is not used (except in a couple places for historical
reasons) in QEMU.

Paolo

      parent reply	other threads:[~2013-07-15 11:38 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-15  2:49 [Qemu-devel] [PATCH 1/2] object: introduce Qref to abstract the refcnt interface Liu Ping Fan
2013-07-15  2:49 ` [Qemu-devel] [PATCH 2/2] object: Object apply the refcnt interface by Qref Liu Ping Fan
2013-07-15 11:38 ` Paolo Bonzini [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51E3DF3B.5040409@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemulist@gmail.com \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.