[Spice-devel] [PATCH 03/18] Store 'renderers' as GArray in RedsState

Frediano Ziglio fziglio at redhat.com
Thu Feb 4 15:57:35 UTC 2016


From: Jonathon Jongsma <jjongsma at redhat.com>

Acked-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/display-channel.c | 13 +++++++------
 server/display-channel.h |  3 +--
 server/reds-private.h    |  1 +
 server/reds.c            | 22 +++++++++++++---------
 server/reds.h            |  5 ++---
 5 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/server/display-channel.c b/server/display-channel.c
index f0d133a..2282847 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -1911,10 +1911,11 @@ void display_channel_create_surface(DisplayChannel *display, uint32_t surface_id
 
     if (display->renderer == RED_RENDERER_INVALID) {
         int i;
-        for (i = 0; i < display->num_renderers; i++) {
-            surface->context.canvas = create_canvas_for_surface(display, surface, display->renderers[i]);
+        for (i = 0; i < display->renderers->len; i++) {
+            uint32_t renderer = g_array_index(display->renderers, uint32_t, i);
+            surface->context.canvas = create_canvas_for_surface(display, surface, renderer);
             if (surface->context.canvas) {
-                display->renderer = display->renderers[i];
+                display->renderer = renderer;
                 break;
             }
         }
@@ -2030,8 +2031,9 @@ DisplayChannel* display_channel_new(RedWorker *worker, int migrate, int stream_v
     static SpiceImageSurfacesOps image_surfaces_ops = {
         image_surfaces_get,
     };
+    GArray *renderers = reds_get_renderers(reds);
 
-    spice_return_val_if_fail(num_renderers > 0, NULL);
+    spice_return_val_if_fail(renderers->len > 0, NULL);
 
     spice_info("create display channel");
     display = (DisplayChannel *)red_worker_new_channel(
@@ -2063,8 +2065,7 @@ DisplayChannel* display_channel_new(RedWorker *worker, int migrate, int stream_v
     stat_compress_init(&display->lz4_stat, "lz4", stat_clock);
 
     display->n_surfaces = n_surfaces;
-    display->num_renderers = num_renderers;
-    memcpy(display->renderers, renderers, sizeof(display->renderers));
+    display->renderers = g_array_ref(renderers);
     display->renderer = RED_RENDERER_INVALID;
 
     ring_init(&display->current_list);
diff --git a/server/display-channel.h b/server/display-channel.h
index bf29cd3..34fb57f 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -168,8 +168,7 @@ struct DisplayChannel {
 
     MonitorsConfig *monitors_config;
 
-    uint32_t num_renderers;
-    uint32_t renderers[RED_RENDERER_LAST];
+    GArray *renderers;
     uint32_t renderer;
     int enable_jpeg;
     int enable_zlib_glz_wrap;
diff --git a/server/reds-private.h b/server/reds-private.h
index bc086ba..9db0da2 100644
--- a/server/reds-private.h
+++ b/server/reds-private.h
@@ -204,6 +204,7 @@ struct RedsState {
 
     int default_channel_security;
     ChannelSecurityOptions *channels_security;
+    GArray *renderers;
 
     int spice_port;
     int spice_secure_port;
diff --git a/server/reds.c b/server/reds.c
index 4c2ac37..4ad8b0f 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -3399,6 +3399,7 @@ SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void)
     reds = spice_new0(RedsState, 1);
     reds->default_channel_security =
         SPICE_CHANNEL_SECURITY_NONE | SPICE_CHANNEL_SECURITY_SSL;
+    reds->renderers = g_array_sized_new(FALSE, TRUE, sizeof(uint32_t), RED_RENDERER_LAST);
     reds->spice_port = -1;
     reds->spice_secure_port = -1;
     reds->spice_listen_socket_fd = -1;
@@ -3431,9 +3432,6 @@ static const RendererInfo renderers_info[] = {
     {RED_RENDERER_INVALID, NULL},
 };
 
-uint32_t renderers[RED_RENDERER_LAST];
-uint32_t num_renderers = 0;
-
 static const RendererInfo *find_renderer(const char *name)
 {
     const RendererInfo *inf = renderers_info;
@@ -3446,14 +3444,14 @@ static const RendererInfo *find_renderer(const char *name)
     return NULL;
 }
 
-static int red_add_renderer(const char *name)
+static int reds_add_renderer(RedsState *reds, const char *name)
 {
     const RendererInfo *inf;
 
-    if (num_renderers == RED_RENDERER_LAST || !(inf = find_renderer(name))) {
+    if (reds->renderers->len == RED_RENDERER_LAST || !(inf = find_renderer(name))) {
         return FALSE;
     }
-    renderers[num_renderers++] = inf->id;
+    g_array_append_val(reds->renderers, inf->id);
     return TRUE;
 }
 
@@ -3463,8 +3461,8 @@ SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *s, SpiceCoreInterface *cor
 
     spice_assert(reds == s);
     ret = do_spice_init(s, core);
-    if (num_renderers == 0) {
-        red_add_renderer(default_renderer);
+    if (s->renderers->len == 0) {
+        reds_add_renderer(s, default_renderer);
     }
     return ret;
 }
@@ -3472,6 +3470,7 @@ SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *s, SpiceCoreInterface *cor
 SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *s)
 {
     spice_assert(reds == s);
+    g_array_unref(s->renderers);
     reds_exit();
 }
 
@@ -3755,7 +3754,7 @@ SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer *s)
 SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *s, const char *name)
 {
     spice_assert(reds == s);
-    if (!red_add_renderer(name)) {
+    if (!reds_add_renderer(s, name)) {
         return -1;
     }
     return 0;
@@ -4008,6 +4007,11 @@ SPICE_GNUC_VISIBLE void spice_server_set_keepalive_timeout(SpiceServer *s, int t
     spice_debug("keepalive timeout=%d", timeout);
 }
 
+GArray* reds_get_renderers(RedsState *reds)
+{
+    return reds->renderers;
+}
+
 spice_wan_compression_t reds_get_jpeg_state(const RedsState *reds)
 {
     return reds->jpeg_state;
diff --git a/server/reds.h b/server/reds.h
index a499b10..b1622b0 100644
--- a/server/reds.h
+++ b/server/reds.h
@@ -63,6 +63,8 @@ gboolean reds_get_agent_mouse(const RedsState *reds); // used by inputs_channel
 int reds_has_vdagent(RedsState *reds); // used by inputs channel
 void reds_handle_agent_mouse_event(RedsState *reds, const VDAgentMouseState *mouse_state); // used by inputs_channel
 
+GArray* reds_get_renderers(RedsState *reds);
+
 enum {
     RED_RENDERER_INVALID,
     RED_RENDERER_SW,
@@ -70,9 +72,6 @@ enum {
     RED_RENDERER_LAST
 };
 
-extern uint32_t renderers[RED_RENDERER_LAST];
-extern uint32_t num_renderers;
-
 extern struct SpiceCoreInterfaceInternal *core;
 
 // Temporary measures to make splitting reds.c to inputs-channel.c easier
-- 
2.5.0



More information about the Spice-devel mailing list