[Spice-devel] [PATCH spice-server 1/2] red-channel: Initialize statistic node correctly
Frediano Ziglio
fziglio at redhat.com
Tue Mar 7 08:18:24 UTC 2017
>
> On Mon, 2017-03-06 at 18:22 +0000, Frediano Ziglio wrote:
> > The default memset(0) on the node does not init it correctly.
> yeah, nice catch, INVALID_STAT_REF = ~0
>
> > Do so to avoid other nodes/counters appended to unwanted nodes.
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > server/red-channel.c | 2 ++
> > server/stat.h | 8 ++++++++
> > 2 files changed, 10 insertions(+)
> >
> > diff --git a/server/red-channel.c b/server/red-channel.c
> > index 8ae6ece..8206f4c 100644
> > --- a/server/red-channel.c
> > +++ b/server/red-channel.c
> > @@ -300,6 +300,8 @@ red_channel_init(RedChannel *self)
> > self->priv->client_cbs.connect =
> > red_channel_client_default_connect;
> > self->priv->client_cbs.disconnect =
> > red_channel_client_default_disconnect;
> > self->priv->client_cbs.migrate =
> > red_channel_client_default_migrate;
> > +
> > + stat_init_node_invalid(&self->priv->stat);
> > }
> >
> >
> > diff --git a/server/stat.h b/server/stat.h
> > index 5255efa..980fb07 100644
> > --- a/server/stat.h
> > +++ b/server/stat.h
> > @@ -70,6 +70,14 @@ stat_remove_counter(SpiceServer *reds,
> > RedStatCounter *counter)
> > #endif /* RED_STATISTICS */
> >
> > static inline void
> > +stat_init_node_invalid(RedStatNode *node)
> maybe 'invalidate' instead of 'invalid', or _set_invalid
>
> Also the argument can be marked as unused
Yes,
> > +{
> > +#ifdef RED_STATISTICS
> > + node->ref = INVALID_STAT_REF;
> > +#endif
> > +}
> > +
> > +static inline void
> > stat_inc_counter(RedStatCounter counter, uint64_t value)
> > {
> > #ifdef RED_STATISTICS
>
> What about using / improving stat_init_node or stat_remove_node
>
> Wouldn't be easier to change the INVALID_STAT_REF define ?
>
>
> Thanks,
> Pavel
>
>
INVALID_STAT_REF is currently part of the ABI for the file.
Unless we use a different invalid for stat-file API one way
is this (less hacky than I though):
diff --git a/server/reds.c b/server/reds.c
index fc720a3..e910404 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -355,22 +355,23 @@ static void reds_link_free(RedLinkInfo *link)
void stat_init_node(RedStatNode *node, SpiceServer *reds, const RedStatNode *parent,
const char *name, int visible)
{
- StatNodeRef parent_ref = parent ? parent->ref : INVALID_STAT_REF;
- node->ref = stat_file_add_node(reds->stat_file, parent_ref, name, visible);
+ StatNodeRef parent_ref = (parent ? parent->masked_ref : 0) ^ INVALID_STAT_REF;
+ node->masked_ref =
+ stat_file_add_node(reds->stat_file, parent_ref, name, visible) ^ INVALID_STAT_REF;
}
void stat_remove_node(SpiceServer *reds, RedStatNode *node)
{
- if (node->ref != INVALID_STAT_REF) {
- stat_file_remove_node(reds->stat_file, node->ref);
- node->ref = INVALID_STAT_REF;
+ if (node->masked_ref) {
+ stat_file_remove_node(reds->stat_file, node->masked_ref ^ INVALID_STAT_REF);
+ node->masked_ref = 0;
}
}
void stat_init_counter(RedStatCounter *counter, SpiceServer *reds,
const RedStatNode *parent, const char *name, int visible)
{
- StatNodeRef parent_ref = parent ? parent->ref : INVALID_STAT_REF;
+ StatNodeRef parent_ref = (parent ? parent->masked_ref : 0) ^ INVALID_STAT_REF;
counter->counter =
stat_file_add_counter(reds->stat_file, parent_ref, name, visible);
}
diff --git a/server/stat.h b/server/stat.h
index 5255efa..d191063 100644
--- a/server/stat.h
+++ b/server/stat.h
@@ -32,7 +32,10 @@ typedef struct {
typedef struct {
#ifdef RED_STATISTICS
- uint32_t ref;
+ /* to allow the use of 0 as default invalid value (ie memset(0)
+ * to work) this value is "masked" with INVALID_STAT_REF
+ * (which is part of file ABI so cannot be changes) */
+ uint32_t masked_ref;
#endif
} RedStatNode;
Does it make sense?
Frediano
More information about the Spice-devel
mailing list