[Spice-devel] [PATCH 18/18] Remove last usage of global 'reds' variable

Fabiano Fidêncio ffidenci at redhat.com
Mon Feb 15 23:35:35 UTC 2016


On Mon, 2016-02-15 at 16:01 +0000, Frediano Ziglio wrote:
> From: Jonathon Jongsma <jjongsma at redhat.com>
> 
> This should be the final piece of removing the global reds variable.
> We
> still need a global variable to clean up during the atexit()
> function,
> but we use a GList of servers (even though we technically don't
> support
> multiple servers in the same process yet).
> ---
>  server/display-channel.c |   2 +
>  server/reds.c            | 188 ++++++++++++++++++++-----------------
> ----------
>  server/reds.h            |   1 -
>  server/smartcard.c       |  15 ++--
>  4 files changed, 90 insertions(+), 116 deletions(-)
> 
> diff --git a/server/display-channel.c b/server/display-channel.c
> index aa84356..e1f07b8 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -1909,6 +1909,8 @@ void
> display_channel_create_surface(DisplayChannel *display, uint32_t
> surface_id
>  
>      if (display->renderer == RED_RENDERER_INVALID) {
>          int i;
> +        QXLInstance *qxl = display->common.qxl;
> +        RedsState *reds = red_dispatcher_get_server(qxl->st-
> >dispatcher);
>          GArray *renderers = reds_get_renderers(reds);
>          for (i = 0; i < renderers->len; i++) {
>              uint32_t renderer = g_array_index(renderers, uint32_t,
> i);
> diff --git a/server/reds.c b/server/reds.c
> index 3334ac0..f241490 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -145,7 +145,9 @@ static SpiceCoreInterfaceInternal
> core_interface_adapter = {
>  static pthread_mutex_t *lock_cs;
>  static long *lock_count;
>  
> -RedsState *reds = NULL;
> +/* While we can technically create more than one server in a
> process, the
> + * intended use is to support a single server per process */
> +GList *servers = NULL;
>  
>  typedef struct RedLinkInfo {
>      RedsState *reds;
> @@ -870,9 +872,8 @@ static int reds_get_n_clients(RedsState *reds)
>      return reds ? reds->num_clients : 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_get_num_clients(SpiceServer *s)
> +SPICE_GNUC_VISIBLE int spice_server_get_num_clients(SpiceServer
> *reds)
>  {
> -    spice_assert(reds == s);
>      return reds_get_n_clients(reds);
>  }
>  
> @@ -2408,11 +2409,10 @@ static void reds_accept(int fd, int event,
> void *data)
>  }
>  
>  
> -SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int
> socket, int skip_auth)
> +SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *reds,
> int socket, int skip_auth)
>  {
>      RedLinkInfo *link;
>  
> -    spice_assert(reds == s);
>      if (!(link = reds_init_client_connection(reds, socket))) {
>          spice_warning("accept failed");
>          return -1;
> @@ -2425,11 +2425,10 @@ SPICE_GNUC_VISIBLE int
> spice_server_add_client(SpiceServer *s, int socket, int s
>  }
>  
>  
> -SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s,
> int socket, int skip_auth)
> +SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer
> *reds, int socket, int skip_auth)
>  {
>      RedLinkInfo *link;
>  
> -    spice_assert(reds == s);
>      if (!(link = reds_init_client_ssl_connection(reds, socket))) {
>          return -1;
>      }
> @@ -2755,8 +2754,9 @@ static int reds_init_ssl(RedsState *reds)
>      return 0;
>  }
>  
> -static void reds_exit(void)
> +static void reds_destroy_internal(RedsState *reds)
>  {
> +    g_array_unref(reds->renderers);
>      if (reds->main_channel) {
>          main_channel_close(reds->main_channel);
>      }
> @@ -2769,6 +2769,16 @@ static void reds_exit(void)
>  #endif
>  }
>  
> +static void reds_exit(void)
> +{
> +    GList *l;
> +
> +    for (l = servers; l != NULL; l = l->next) {
> +        RedsState *reds = l->data;
> +        reds_destroy_internal(reds);
> +    }
> +}
> +
>  static inline void on_activating_ticketing(RedsState *reds)
>  {
>      if (!reds->ticketing_enabled &&
> reds_main_channel_connected(reds)) {
> @@ -3092,18 +3102,16 @@ void
> reds_on_char_device_state_destroy(RedsState *reds,
> SpiceCharDeviceState *de
>      reds_char_device_remove_state(reds, dev);
>  }
>  
> -static int spice_server_char_device_add_interface(SpiceServer *s,
> +static int spice_server_char_device_add_interface(SpiceServer *reds,
>                                             SpiceBaseInstance *sin)
>  {
>      SpiceCharDeviceInstance* char_device =
>              SPICE_CONTAINEROF(sin, SpiceCharDeviceInstance, base);
>      SpiceCharDeviceState *dev_state = NULL;
>  
> -    spice_assert(s == reds);
> -
>      spice_info("CHAR_DEVICE %s", char_device->subtype);
>      if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) {
> -        if (s->vdagent) {
> +        if (reds->vdagent) {
>              spice_warning("vdagent already attached");
>              return -1;
>          }
> @@ -3168,13 +3176,11 @@ static void
> spice_server_char_device_remove_interface(RedsState *reds, SpiceBase
>      char_device->st = NULL;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s,
> +SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *reds,
>                                                    SpiceBaseInstance
> *sin)
>  {
>      const SpiceBaseInterface *interface = sin->sif;
>  
> -    spice_assert(reds == s);
> -
>      if (strcmp(interface->type, SPICE_INTERFACE_KEYBOARD) == 0) {
>          spice_info("SPICE_INTERFACE_KEYBOARD");
>          if (interface->major_version !=
> SPICE_INTERFACE_KEYBOARD_MAJOR ||
> @@ -3264,7 +3270,7 @@ SPICE_GNUC_VISIBLE int
> spice_server_add_interface(SpiceServer *s,
>              spice_warning("unsupported char device interface");
>              return -1;
>          }
> -        spice_server_char_device_add_interface(s, sin);
> +        spice_server_char_device_add_interface(reds, sin);
>  
>      } else if (strcmp(interface->type, SPICE_INTERFACE_MIGRATION) ==
> 0) {
>          spice_info("SPICE_INTERFACE_MIGRATION");
> @@ -3343,6 +3349,7 @@ const char *version_string = VERSION;
>  
>  static int do_spice_init(RedsState *reds, SpiceCoreInterface
> *core_interface)
>  {
> +    static gboolean first = TRUE;
>      spice_info("starting %s", version_string);
>  
>      if (core_interface->base.major_version !=
> SPICE_INTERFACE_CORE_MAJOR) {
> @@ -3423,7 +3430,11 @@ static int do_spice_init(RedsState *reds,
> SpiceCoreInterface *core_interface)
>      if (reds->allow_multiple_clients) {
>          spice_warning("spice: allowing multiple client
> connections");
>      }
> -    atexit(reds_exit);
> +    if (first) {
> +        atexit(reds_exit);
> +        first = FALSE;
> +    }
> +    servers = g_list_prepend(servers, reds);
>      return 0;
>  
>  err:
> @@ -3435,10 +3446,7 @@ static const char default_renderer[] = "sw";
>  /* new interface */
>  SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void)
>  {
> -    /* we can't handle multiple instances (yet) */
> -    spice_assert(reds == NULL);
> -
> -    reds = spice_new0(RedsState, 1);
> +    RedsState *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);
> @@ -3497,23 +3505,23 @@ static int reds_add_renderer(RedsState *reds,
> const char *name)
>      return TRUE;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *s,
> SpiceCoreInterface *core)
> +SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds,
> SpiceCoreInterface *core)
>  {
>      int ret;
>  
> -    spice_assert(reds == s);
> -    ret = do_spice_init(s, core);
> -    if (s->renderers->len == 0) {
> -        reds_add_renderer(s, default_renderer);
> +    ret = do_spice_init(reds, core);
> +    if (reds->renderers->len == 0) {
> +        reds_add_renderer(reds, default_renderer);
>      }
>      return ret;
>  }
>  
> -SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *s)
> +SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *reds)
>  {
> -    spice_assert(reds == s);
> -    g_array_unref(s->renderers);
> -    reds_exit();
> +    reds_destroy_internal(reds);
> +    /* remove the server from the list of servers so that we don't
> attempt to
> +     * free it again at exit */
> +    servers = g_list_remove(servers, reds);
>  }
>  
>  SPICE_GNUC_VISIBLE spice_compat_version_t
> spice_get_current_compat_version(void)
> @@ -3521,7 +3529,7 @@ SPICE_GNUC_VISIBLE spice_compat_version_t
> spice_get_current_compat_version(void)
>      return SPICE_COMPAT_VERSION_CURRENT;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer
> *s,
> +SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer
> *reds,
>                                                         spice_compat_
> version_t version)
>  {
>      if (version < SPICE_COMPAT_VERSION_0_6) {
> @@ -3536,28 +3544,25 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_compat_version(SpiceServer *s,
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_port(SpiceServer *s, int
> port)
> +SPICE_GNUC_VISIBLE int spice_server_set_port(SpiceServer *reds, int
> port)
>  {
> -    spice_assert(reds == s);
>      if (port < 0 || port > 0xffff) {
>          return -1;
>      }
> -    s->spice_port = port;
> +    reds->spice_port = port;
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *s, const
> char *addr, int flags)
> +SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *reds,
> const char *addr, int flags)
>  {
> -    spice_assert(reds == s);
> -
> -    g_strlcpy(s->spice_addr, addr, sizeof(s->spice_addr));
> +    g_strlcpy(reds->spice_addr, addr, sizeof(reds->spice_addr));
>  
>      if (flags == SPICE_ADDR_FLAG_IPV4_ONLY) {
> -        s->spice_family = PF_INET;
> +        reds->spice_family = PF_INET;
>      } else if (flags == SPICE_ADDR_FLAG_IPV6_ONLY) {
> -        s->spice_family = PF_INET6;
> +        reds->spice_family = PF_INET6;
>      } else if (flags == SPICE_ADDR_FLAG_UNIX_ONLY) {
> -        s->spice_family = AF_UNIX;
> +        reds->spice_family = AF_UNIX;
>      } else if (flags != 0) {
>          spice_warning("unknown address flag: 0x%X", flags);
>      }
> @@ -3565,21 +3570,18 @@ SPICE_GNUC_VISIBLE void
> spice_server_set_addr(SpiceServer *s, const char *addr,
>  
>  SPICE_GNUC_VISIBLE int spice_server_set_listen_socket_fd(SpiceServer
> *s, int listen_fd)
>  {
> -    spice_assert(reds == s);
>      s->spice_listen_socket_fd = listen_fd;
>      return 0;
>  }
>  
>  SPICE_GNUC_VISIBLE int
> spice_server_set_exit_on_disconnect(SpiceServer *s, int flag)
>  {
> -    spice_assert(reds == s);
>      s->exit_on_disconnect = !!flag;
>      return 0;
>  }
>  
>  SPICE_GNUC_VISIBLE int spice_server_set_noauth(SpiceServer *s)
>  {
> -    spice_assert(reds == s);
>      memset(s->taTicket.password, 0, sizeof(s->taTicket.password));
>      s->ticketing_enabled = FALSE;
>      return 0;
> @@ -3587,7 +3589,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_noauth(SpiceServer *s)
>  
>  SPICE_GNUC_VISIBLE int spice_server_set_sasl(SpiceServer *s, int
> enabled)
>  {
> -    spice_assert(reds == s);
>  #if HAVE_SASL
>      s->sasl_enabled = enabled;
>      return 0;
> @@ -3598,7 +3599,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_sasl(SpiceServer *s, int enabled)
>  
>  SPICE_GNUC_VISIBLE int spice_server_set_sasl_appname(SpiceServer *s,
> const char *appname)
>  {
> -    spice_assert(reds == s);
>  #if HAVE_SASL
>      free(s->sasl_appname);
>      s->sasl_appname = spice_strdup(appname);
> @@ -3620,13 +3620,11 @@ SPICE_GNUC_VISIBLE void
> spice_server_set_uuid(SpiceServer *s, const uint8_t uuid
>      s->spice_uuid_is_set = TRUE;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_ticket(SpiceServer *s,
> +SPICE_GNUC_VISIBLE int spice_server_set_ticket(SpiceServer *reds,
>                                                 const char *passwd,
> int lifetime,
>                                                 int
> fail_if_connected,
>                                                 int
> disconnect_if_connected)
>  {
> -    spice_assert(reds == s);
> -
>      if (reds_main_channel_connected(reds)) {
>          if (fail_if_connected) {
>              return -1;
> @@ -3660,7 +3658,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_tls(SpiceServer *s, int port,
>                                              const char
> *private_key_file, const char *key_passwd,
>                                              const char *dh_key_file,
> const char *ciphersuite)
>  {
> -    spice_assert(reds == s);
>      if (port == 0 || ca_cert_file == NULL || certs_file == NULL ||
>          private_key_file == NULL) {
>          return -1;
> @@ -3696,7 +3693,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_tls(SpiceServer *s, int port,
>  SPICE_GNUC_VISIBLE int
> spice_server_set_image_compression(SpiceServer *s,
>                                                            SpiceImage
> Compression comp)
>  {
> -    spice_assert(reds == s);
>  #ifndef USE_LZ4
>      if (comp == SPICE_IMAGE_COMPRESSION_LZ4) {
>          spice_warning("LZ4 compression not supported, falling back
> to auto GLZ");
> @@ -3711,13 +3707,11 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_image_compression(SpiceServer *s,
>  
>  SPICE_GNUC_VISIBLE SpiceImageCompression
> spice_server_get_image_compression(SpiceServer *s)
>  {
> -    spice_assert(reds == s);
>      return s->image_compression;
>  }
>  
>  SPICE_GNUC_VISIBLE int spice_server_set_jpeg_compression(SpiceServer
> *s, spice_wan_compression_t comp)
>  {
> -    spice_assert(reds == s);
>      if (comp == SPICE_WAN_COMPRESSION_INVALID) {
>          spice_error("invalid jpeg state");
>          return -1;
> @@ -3729,7 +3723,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_jpeg_compression(SpiceServer *s, spice_w
>  
>  SPICE_GNUC_VISIBLE int
> spice_server_set_zlib_glz_compression(SpiceServer *s,
> spice_wan_compression_t comp)
>  {
> -    spice_assert(reds == s);
>      if (comp == SPICE_WAN_COMPRESSION_INVALID) {
>          spice_error("invalid zlib_glz state");
>          return -1;
> @@ -3756,8 +3749,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_channel_security(SpiceServer *s, const c
>      };
>      int i;
>  
> -    spice_assert(reds == s);
> -
>      if (channel == NULL) {
>          s->default_channel_security = security;
>          return 0;
> @@ -3771,34 +3762,30 @@ SPICE_GNUC_VISIBLE int
> spice_server_set_channel_security(SpiceServer *s, const c
>      return -1;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_get_sock_info(SpiceServer *s,
> struct sockaddr *sa, socklen_t *salen)
> +SPICE_GNUC_VISIBLE int spice_server_get_sock_info(SpiceServer *reds,
> struct sockaddr *sa, socklen_t *salen)
>  {
> -    spice_assert(reds == s);
>      if (main_channel_getsockname(reds->main_channel, sa, salen) < 0)
> {
>          return -1;
>      }
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_get_peer_info(SpiceServer *s,
> struct sockaddr *sa, socklen_t *salen)
> +SPICE_GNUC_VISIBLE int spice_server_get_peer_info(SpiceServer *reds,
> struct sockaddr *sa, socklen_t *salen)
>  {
> -    spice_assert(reds == s);
>      if (main_channel_getpeername(reds->main_channel, sa, salen) < 0)
> {
>          return -1;
>      }
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer *s)
> +SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer
> *reds)
>  {
> -    spice_assert(reds == s);
>      return reds->mouse_mode == SPICE_MOUSE_MODE_SERVER;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *s,
> const char *name)
> +SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *reds,
> const char *name)
>  {
> -    spice_assert(reds == s);
> -    if (!reds_add_renderer(s, name)) {
> +    if (!reds_add_renderer(reds, name)) {
>          return -1;
>      }
>      return 0;
> @@ -3811,14 +3798,13 @@ SPICE_GNUC_VISIBLE int
> spice_server_kbd_leds(SpiceKbdInstance *sin, int leds)
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_streaming_video(SpiceServer
> *s, int value)
> +SPICE_GNUC_VISIBLE int spice_server_set_streaming_video(SpiceServer
> *reds, int value)
>  {
> -    spice_assert(reds == s);
>      if (value != SPICE_STREAM_VIDEO_OFF &&
>          value != SPICE_STREAM_VIDEO_ALL &&
>          value != SPICE_STREAM_VIDEO_FILTER)
>          return -1;
> -    s->streaming_video = value;
> +    reds->streaming_video = value;
>      reds_on_sv_change(reds);
>      return 0;
>  }
> @@ -3828,36 +3814,32 @@ uint32_t reds_get_streaming_video(const
> RedsState *reds)
>      return reds->streaming_video;
>  }
>  
> -SPICE_GNUC_VISIBLE int
> spice_server_set_playback_compression(SpiceServer *s, int enable)
> +SPICE_GNUC_VISIBLE int
> spice_server_set_playback_compression(SpiceServer *reds, int enable)
>  {
> -    spice_assert(reds == s);
>      snd_set_playback_compression(enable);
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer *s,
> int enable)
> +SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer
> *reds, int enable)
>  {
> -    spice_assert(reds == s);
>      reds->agent_mouse = enable;
>      reds_update_mouse_mode(reds);
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer
> *s, int enable)
> +SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer
> *reds, int enable)
>  {
> -    spice_assert(reds == s);
> -    s->agent_copypaste = enable;
> -    reds->agent_state.write_filter.copy_paste_enabled = s-
> >agent_copypaste;
> -    reds->agent_state.read_filter.copy_paste_enabled = s-
> >agent_copypaste;
> +    reds->agent_copypaste = enable;
> +    reds->agent_state.write_filter.copy_paste_enabled = reds-
> >agent_copypaste;
> +    reds->agent_state.read_filter.copy_paste_enabled = reds-
> >agent_copypaste;
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer
> *s, int enable)
> +SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer
> *reds, int enable)
>  {
> -    spice_assert(reds == s);
> -    s->agent_file_xfer = enable;
> -    reds->agent_state.write_filter.file_xfer_enabled = s-
> >agent_file_xfer;
> -    reds->agent_state.read_filter.file_xfer_enabled = s-
> >agent_file_xfer;
> +    reds->agent_file_xfer = enable;
> +    reds->agent_state.write_filter.file_xfer_enabled = reds-
> >agent_file_xfer;
> +    reds->agent_state.read_filter.file_xfer_enabled = reds-
> >agent_file_xfer;
>      return 0;
>  }
>  
> @@ -3888,7 +3870,7 @@ static int
> reds_set_migration_dest_info(RedsState *reds,
>  }
>  
>  /* semi-seamless client migration */
> -SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *s,
> const char* dest,
> +SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer
> *reds, const char* dest,
>                                                      int port, int
> secure_port,
>                                                      const char*
> cert_subject)
>  {
> @@ -3896,18 +3878,17 @@ SPICE_GNUC_VISIBLE int
> spice_server_migrate_connect(SpiceServer *s, const char*
>      int try_seamless;
>  
>      spice_info(NULL);
> -    spice_assert(s->migration_interface);
> -    spice_assert(reds == s);
> +    spice_assert(reds->migration_interface);
>  
>      if (reds->expect_migrate) {
>          spice_info("consecutive calls without migration. Canceling
> previous call");
>          main_channel_migrate_src_complete(reds->main_channel,
> FALSE);
>      }
>  
> -    sif = SPICE_CONTAINEROF(s->migration_interface->base.sif,
> SpiceMigrateInterface, base);
> +    sif = SPICE_CONTAINEROF(reds->migration_interface->base.sif,
> SpiceMigrateInterface, base);
>  
>      if (!reds_set_migration_dest_info(reds, dest, port, secure_port,
> cert_subject)) {
> -        sif->migrate_connect_complete(s->migration_interface);
> +        sif->migrate_connect_complete(reds->migration_interface);
>          return -1;
>      }
>  
> @@ -3933,18 +3914,18 @@ SPICE_GNUC_VISIBLE int
> spice_server_migrate_connect(SpiceServer *s, const char*
>              reds_mig_release(reds);
>              spice_info("no client connected");
>          }
> -        sif->migrate_connect_complete(s->migration_interface);
> +        sif->migrate_connect_complete(reds->migration_interface);
>      }
>  
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *s,
> const char* dest,
> +SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *reds,
> const char* dest,
>                                            int port, int secure_port,
>                                            const char* cert_subject)
>  {
>      spice_info(NULL);
> -    spice_assert(!s->migration_interface);
> +    spice_assert(!reds->migration_interface);
>  
>      if (!reds_set_migration_dest_info(reds, dest, port, secure_port,
> cert_subject)) {
>          return -1;
> @@ -3952,9 +3933,8 @@ SPICE_GNUC_VISIBLE int
> spice_server_migrate_info(SpiceServer *s, const char* des
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *s)
> +SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *reds)
>  {
> -    spice_assert(reds == s);
>      spice_info(NULL);
>      if (!reds->mig_spice) {
>          return -1;
> @@ -3962,17 +3942,16 @@ SPICE_GNUC_VISIBLE int
> spice_server_migrate_start(SpiceServer *s)
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *s, int
> completed)
> +SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *reds,
> int completed)
>  {
>      SpiceMigrateInterface *sif;
>      int ret = 0;
>  
>      spice_info(NULL);
>  
> -    spice_assert(s->migration_interface);
> -    spice_assert(reds == s);
> +    spice_assert(reds->migration_interface);
>  
> -    sif = SPICE_CONTAINEROF(s->migration_interface->base.sif,
> SpiceMigrateInterface, base);
> +    sif = SPICE_CONTAINEROF(reds->migration_interface->base.sif,
> SpiceMigrateInterface, base);
>      if (completed && !reds->expect_migrate && reds->num_clients) {
>          spice_warning("spice_server_migrate_info was not called,
> disconnecting clients");
>          reds_disconnect(reds);
> @@ -3989,15 +3968,14 @@ SPICE_GNUC_VISIBLE int
> spice_server_migrate_end(SpiceServer *s, int completed)
>      return 0;
>  complete:
>      if (sif->migrate_end_complete) {
> -        sif->migrate_end_complete(s->migration_interface);
> +        sif->migrate_end_complete(reds->migration_interface);
>      }
>      return ret;
>  }
>  
>  /* interface for switch-host migration */
> -SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer *s)
> +SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer
> *reds)
>  {
> -    spice_assert(reds == s);
>      spice_info(NULL);
>      if (!reds->num_clients) {
>         return 0;
> @@ -4007,11 +3985,10 @@ SPICE_GNUC_VISIBLE int
> spice_server_migrate_switch(SpiceServer *s)
>      return 0;
>  }
>  
> -SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *s)
> +SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *reds)
>  {
>      RingItem *item;
>  
> -    spice_assert(s == reds);
>      reds->vm_running = TRUE;
>      RING_FOREACH(item, &reds->char_devs_states) {
>          SpiceCharDeviceStateItem *st_item;
> @@ -4022,11 +3999,10 @@ SPICE_GNUC_VISIBLE void
> spice_server_vm_start(SpiceServer *s)
>      reds_on_vm_start(reds);
>  }
>  
> -SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *s)
> +SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *reds)
>  {
>      RingItem *item;
>  
> -    spice_assert(s == reds);
>      reds->vm_running = FALSE;
>      RING_FOREACH(item, &reds->char_devs_states) {
>          SpiceCharDeviceStateItem *st_item;
> @@ -4037,17 +4013,15 @@ SPICE_GNUC_VISIBLE void
> spice_server_vm_stop(SpiceServer *s)
>      reds_on_vm_stop(reds);
>  }
>  
> -SPICE_GNUC_VISIBLE void
> spice_server_set_seamless_migration(SpiceServer *s, int enable)
> +SPICE_GNUC_VISIBLE void
> spice_server_set_seamless_migration(SpiceServer *reds, int enable)
>  {
> -    spice_assert(s == reds);
>      /* seamless migration is not supported with multiple clients */
>      reds->seamless_migration_enabled = enable && !reds-
> >allow_multiple_clients;
>      spice_debug("seamless migration enabled=%d", enable);
>  }
>  
> -SPICE_GNUC_VISIBLE void
> spice_server_set_keepalive_timeout(SpiceServer *s, int timeout)
> +SPICE_GNUC_VISIBLE void
> spice_server_set_keepalive_timeout(SpiceServer *reds, int timeout)
>  {
> -    spice_assert(s == reds);
>      reds->keepalive_timeout = timeout;
>      spice_debug("keepalive timeout=%d", timeout);
>  }
> diff --git a/server/reds.h b/server/reds.h
> index 891a1ea..8e9bbbc 100644
> --- a/server/reds.h
> +++ b/server/reds.h
> @@ -32,7 +32,6 @@
>  #include "migration-protocol.h"
>  
>  typedef struct RedsState RedsState;
> -extern RedsState *reds;
>  
>  struct QXLState {
>      QXLInterface          *qif;
> diff --git a/server/smartcard.c b/server/smartcard.c
> index c7b1f30..565a71d 100644
> --- a/server/smartcard.c
> +++ b/server/smartcard.c
> @@ -107,7 +107,7 @@ static struct Readers {
>  
>  static SpiceCharDeviceInstance*
> smartcard_readers_get_unattached(void);
>  static SpiceCharDeviceInstance* smartcard_readers_get(uint32_t
> reader_id);
> -static int
> smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *sin);
> +static int smartcard_char_device_add_to_readers(RedsState *reds,
> SpiceCharDeviceInstance *sin);
>  static void smartcard_char_device_attach_client(
>      SpiceCharDeviceInstance *char_device, SmartCardChannelClient
> *scc);
>  static void
> smartcard_channel_write_to_reader(SpiceCharDeviceWriteBuffer
> *write_buf);
> @@ -116,7 +116,7 @@ static MsgItem
> *smartcard_char_device_on_message_from_device(
>      SmartCardDeviceState *state, VSCMsgHeader *header);
>  static SmartCardDeviceState *smartcard_device_state_new(RedsState
> *reds, SpiceCharDeviceInstance *sin);
>  static void smartcard_device_state_free(SmartCardDeviceState* st);
> -static void smartcard_init(void);
> +static void smartcard_init(RedsState *reds);
>  
>  static void smartcard_read_buf_prepare(SmartCardDeviceState *state,
> VSCMsgHeader *vheader)
>  {
> @@ -231,7 +231,7 @@ MsgItem
> *smartcard_char_device_on_message_from_device(SmartCardDeviceState
> *stat
>      return NULL;
>  }
>  
> -static int
> smartcard_char_device_add_to_readers(SpiceCharDeviceInstance
> *char_device)
> +static int smartcard_char_device_add_to_readers(RedsState *reds,
> SpiceCharDeviceInstance *char_device)
>  {
>      SmartCardDeviceState *state =
> spice_char_device_state_opaque_get(char_device->st);
>  
> @@ -240,7 +240,7 @@ static int
> smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *char_de
>      }
>      state->reader_id = g_smartcard_readers.num;
>      g_smartcard_readers.sin[g_smartcard_readers.num++] =
> char_device;
> -    smartcard_init();
> +    smartcard_init(reds);
>      return 0;
>  }
>  
> @@ -317,7 +317,7 @@ SpiceCharDeviceState
> *smartcard_device_connect(RedsState *reds, SpiceCharDeviceI
>      SmartCardDeviceState *st;
>  
>      st = smartcard_device_state_new(reds, char_device);
> -    if (smartcard_char_device_add_to_readers(char_device) == -1) {
> +    if (smartcard_char_device_add_to_readers(reds, char_device) ==
> -1) {
>          smartcard_device_state_free(st);
>          return NULL;
>      }
> @@ -830,7 +830,7 @@ static void smartcard_connect_client(RedChannel
> *channel, RedClient *client,
>  
>  SmartCardChannel *g_smartcard_channel;
>  
> -static void smartcard_init(void)
> +static void smartcard_init(RedsState *reds)
>  {
>      ChannelCbs channel_cbs = { NULL, };
>      ClientCbs client_cbs = { NULL, };
> @@ -849,8 +849,7 @@ static void smartcard_init(void)
>      channel_cbs.handle_migrate_data =
> smartcard_channel_client_handle_migrate_data;
>  
>      g_smartcard_channel =
> (SmartCardChannel*)red_channel_create(sizeof(SmartCardChannel),
> -                                             reds,
> -                                             reds_get_core_interface
> (reds),
> +                                             reds,
> reds_get_core_interface(reds),
>                                               SPICE_CHANNEL_SMARTCARD
> , 0,
>                                               FALSE /* handle_acks
> */,
>                                               smartcard_channel_handl
> e_message,

Acked-by: Fabiano Fidêncio <fidencio at redhat.com>


More information about the Spice-devel mailing list