[Spice-devel] [PATCH spice-server v2 2/2] red-channel: Initialize base statistic node creating the object

Christophe Fergeau cfergeau at redhat.com
Mon Mar 27 11:32:41 UTC 2017


On Mon, Mar 27, 2017 at 07:06:30AM -0400, Frediano Ziglio wrote:
> > The stat counters only seem to be used once we have a
> > DisplayChannelClient though, so we could init everything after the
> > DisplayChannel has been created, ie:
> > 
> >     worker->display_channel = display_channel_new(reds, qxl, &worker->core,
> >     FALSE,
> >                                                   reds_get_streaming_video(reds),
> >                                                   reds_get_video_codecs(reds),
> >                                                   init_info.n_surfaces);
> >     channel = RED_CHANNEL(worker->display_channel);
> >     display_channel_init_stats(display_channel, &worker->stat,
> >     "display_channel");
> > 
> 
> This is the way is done currently and as I said this does not work
> as the counters are initialized in display_channel_new so before
> display_channel_init_stats is called.

If we have a display_channel_init_stats() method, then the counter
creation can be done in that method rather than in _constructed. I
assume we don't need the stat counters that early in the DisplayChannel
lifetime?

My suggestion (only compile-tested):

diff --git a/server/display-channel.c b/server/display-channel.c
index a35145c..ac70be3 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -2127,14 +2127,6 @@ display_channel_constructed(GObject *object)
     stat_init(&self->priv->add_stat, "add", CLOCK_THREAD_CPUTIME_ID);
     stat_init(&self->priv->exclude_stat, "exclude", CLOCK_THREAD_CPUTIME_ID);
     stat_init(&self->priv->__exclude_stat, "__exclude", CLOCK_THREAD_CPUTIME_ID);
-    RedsState *reds = red_channel_get_server(RED_CHANNEL(self));
-    const RedStatNode *stat = red_channel_get_stat_node(channel);
-    stat_init_counter(&self->priv->cache_hits_counter, reds, stat,
-                      "cache_hits", TRUE);
-    stat_init_counter(&self->priv->add_to_cache_counter, reds, stat,
-                      "add_to_cache", TRUE);
-    stat_init_counter(&self->priv->non_cache_counter, reds, stat,
-                      "non_cache", TRUE);
     image_cache_init(&self->priv->image_cache);
     self->priv->stream_video = SPICE_STREAM_VIDEO_OFF;
     display_channel_init_streams(self);
@@ -2145,6 +2137,21 @@ display_channel_constructed(GObject *object)
     red_channel_set_cap(channel, SPICE_DISPLAY_CAP_STREAM_REPORT);
 }
 
+void display_channel_init_stat_node(DisplayChannel *self, RedStatNode *parent)
+{
+    const RedStatNode *stat = red_channel_get_stat_node(RED_CHANNEL(self));
+    RedsState *reds = red_channel_get_server(RED_CHANNEL(self));
+
+    red_channel_init_stat_node(RED_CHANNEL(self), parent, "display_channel");
+
+    stat_init_counter(&self->priv->cache_hits_counter, reds, stat,
+                      "cache_hits", TRUE);
+    stat_init_counter(&self->priv->add_to_cache_counter, reds, stat,
+                      "add_to_cache", TRUE);
+    stat_init_counter(&self->priv->non_cache_counter, reds, stat,
+                      "non_cache", TRUE);
+}
+
 void display_channel_process_surface_cmd(DisplayChannel *display,
                                          const RedSurfaceCmd *surface_cmd,
                                          int loadvm)
diff --git a/server/display-channel.h b/server/display-channel.h
index 4414de1..a6a5944 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -43,6 +43,7 @@
 #include "dcc.h"
 #include "image-encoders.h"
 #include "common-graphics-channel.h"
+#include "stat.h"
 
 G_BEGIN_DECLS
 
@@ -382,6 +383,8 @@ static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data)
     }
 }
 
+void display_channel_init_stat_node(DisplayChannel *self, RedStatNode *parent);
+
 G_END_DECLS
 
 #endif /* DISPLAY_CHANNEL_H_ */
diff --git a/server/red-worker.c b/server/red-worker.c
index 4876143..cf9e45e 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -1370,7 +1370,7 @@ RedWorker* red_worker_new(QXLInstance *qxl,
                                                   reds_get_video_codecs(reds),
                                                   init_info.n_surfaces);
     channel = RED_CHANNEL(worker->display_channel);
-    red_channel_init_stat_node(channel, &worker->stat, "display_channel");
+    display_channel_init_stat_node(worker->display_channel, &worker->stat);
     red_channel_register_client_cbs(channel, client_display_cbs, dispatcher);
     g_object_set_data(G_OBJECT(channel), "dispatcher", dispatcher);
     reds_register_channel(reds, channel);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170327/4fd826bc/attachment.sig>


More information about the Spice-devel mailing list