From: Jonathon Jongsma <jjongsma@xxxxxxxxxx> Acked-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- 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 9028f6a..bc790e8 100644 --- a/server/reds-private.h +++ b/server/reds-private.h @@ -195,6 +195,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 37bfa7c..2e24c0e 100644 --- a/server/reds.c +++ b/server/reds.c @@ -3415,6 +3415,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; @@ -3440,9 +3441,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; @@ -3455,14 +3453,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; } @@ -3472,8 +3470,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; } @@ -3481,6 +3479,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(); } @@ -3764,7 +3763,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; @@ -4012,6 +4011,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 0cc6ec7..97b08b5 100644 --- a/server/reds.h +++ b/server/reds.h @@ -63,6 +63,8 @@ int reds_get_agent_mouse(void); // 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; extern uint32_t streaming_video; extern spice_wan_compression_t zlib_glz_state; -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel