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
prev 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.