[Spice-devel] [PATCH 15/18] Remove global main_dispatcher variable

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


On Mon, 2016-02-15 at 16:01 +0000, Frediano Ziglio wrote:
> From: Jonathon Jongsma <jjongsma at redhat.com>
> 
> Requires changing a bunch of internal API to take MainDispatcher
> arguments, etc. The main dispatcher object is now owned by RedsState,
> since that is the object that previously created (initialized) it.
> ---
>  server/main-channel.c    |  3 +-
>  server/main-dispatcher.c | 83 ++++++++++++++++++++++++++----------
> ------------
>  server/main-dispatcher.h | 12 ++++---
>  server/red-channel.c     |  4 ++-
>  server/reds-private.h    |  1 +
>  server/reds-stream.c     |  4 ++-
>  server/reds.c            |  7 +++-
>  server/reds.h            |  2 ++
>  server/stream.c          |  5 ++-
>  9 files changed, 73 insertions(+), 48 deletions(-)
> 
> diff --git a/server/main-channel.c b/server/main-channel.c
> index 6ea47cf..4601b1d 100644
> --- a/server/main-channel.c
> +++ b/server/main-channel.c
> @@ -178,8 +178,9 @@ int main_channel_is_connected(MainChannel
> *main_chan)
>   */
>  static void main_channel_client_on_disconnect(RedChannelClient *rcc)
>  {
> +    RedsState *reds = red_channel_get_server(rcc->channel);
>      spice_printerr("rcc=%p", rcc);
> -    main_dispatcher_client_disconnect(rcc->client);
> +    main_dispatcher_client_disconnect(reds_get_main_dispatcher(reds)
> , rcc->client);
>  }
>  
>  RedClient *main_channel_get_client_by_link_id(MainChannel
> *main_chan, uint32_t connection_id)
> diff --git a/server/main-dispatcher.c b/server/main-dispatcher.c
> index 777a44f..298a961 100644
> --- a/server/main-dispatcher.c
> +++ b/server/main-dispatcher.c
> @@ -47,12 +47,11 @@
>   *   seperate from self because it may send an ack or do other work
> in the future.
>   */
>  
> -typedef struct {
> +struct MainDispatcher {
>      Dispatcher base;
>      SpiceCoreInterfaceInternal *core;
> -} MainDispatcher;
> -
> -MainDispatcher main_dispatcher;
> +    RedsState *reds;
> +};
>  
>  enum {
>      MAIN_DISPATCHER_CHANNEL_EVENT = 0,
> @@ -82,33 +81,35 @@ typedef struct
> MainDispatcherClientDisconnectMessage {
>  } MainDispatcherClientDisconnectMessage;
>  
>  /* channel_event - calls core->channel_event, must be done in main
> thread */
> -static void main_dispatcher_self_handle_channel_event(
> -                                                int event,
> -                                                SpiceChannelEventInf
> o *info)
> +static void main_dispatcher_self_handle_channel_event(MainDispatcher
> *self,
> +                                                      int event,
> +                                                      SpiceChannelEv
> entInfo *info)
>  {
> -    reds_handle_channel_event(reds, event, info);
> +    reds_handle_channel_event(self->reds, event, info);
>  }
>  
>  static void main_dispatcher_handle_channel_event(void *opaque,
>                                                   void *payload)
>  {
> +    MainDispatcher *self = opaque;
>      MainDispatcherChannelEventMessage *channel_event = payload;
>  
> -    main_dispatcher_self_handle_channel_event(channel_event->event,
> +    main_dispatcher_self_handle_channel_event(self,
> +                                              channel_event->event,
>                                                channel_event->info);
>  }
>  
> -void main_dispatcher_channel_event(int event, SpiceChannelEventInfo
> *info)
> +void main_dispatcher_channel_event(MainDispatcher *self, int event,
> SpiceChannelEventInfo *info)
>  {
>      MainDispatcherChannelEventMessage msg = {0,};
>  
> -    if (pthread_self() == main_dispatcher.base.self) {
> -        main_dispatcher_self_handle_channel_event(event, info);
> +    if (pthread_self() == self->base.self) {
> +        main_dispatcher_self_handle_channel_event(self, event,
> info);
>          return;
>      }
>      msg.event = event;
>      msg.info = info;
> -    dispatcher_send_message(&main_dispatcher.base,
> MAIN_DISPATCHER_CHANNEL_EVENT,
> +    dispatcher_send_message(&self->base,
> MAIN_DISPATCHER_CHANNEL_EVENT,
>                              &msg);
>  }
>  
> @@ -116,67 +117,71 @@ void main_dispatcher_channel_event(int event,
> SpiceChannelEventInfo *info)
>  static void main_dispatcher_handle_migrate_complete(void *opaque,
>                                                      void *payload)
>  {
> +    MainDispatcher *self = opaque;
>      MainDispatcherMigrateSeamlessDstCompleteMessage *mig_complete =
> payload;
>  
> -    reds_on_client_seamless_migrate_complete(reds, mig_complete-
> >client);
> +    reds_on_client_seamless_migrate_complete(self->reds,
> mig_complete->client);
>      red_client_unref(mig_complete->client);
>  }
>  
>  static void main_dispatcher_handle_mm_time_latency(void *opaque,
>                                                     void *payload)
>  {
> +    MainDispatcher *self = opaque;
>      MainDispatcherMmTimeLatencyMessage *msg = payload;
> -    reds_set_client_mm_time_latency(reds, msg->client, msg-
> >latency);
> +    reds_set_client_mm_time_latency(self->reds, msg->client, msg-
> >latency);
>      red_client_unref(msg->client);
>  }
>  
>  static void main_dispatcher_handle_client_disconnect(void *opaque,
>                                                       void *payload)
>  {
> +    MainDispatcher *self = opaque;
>      MainDispatcherClientDisconnectMessage *msg = payload;
>  
>      spice_debug("client=%p", msg->client);
> -    reds_client_disconnect(reds, msg->client);
> +    reds_client_disconnect(self->reds, msg->client);
>      red_client_unref(msg->client);
>  }
>  
> -void main_dispatcher_seamless_migrate_dst_complete(RedClient
> *client)
> +void main_dispatcher_seamless_migrate_dst_complete(MainDispatcher
> *self,
> +                                                   RedClient
> *client)
>  {
>      MainDispatcherMigrateSeamlessDstCompleteMessage msg;
>  
> -    if (pthread_self() == main_dispatcher.base.self) {
> -        reds_on_client_seamless_migrate_complete(reds, client);
> +    if (pthread_self() == self->base.self) {
> +        reds_on_client_seamless_migrate_complete(self->reds,
> client);
>          return;
>      }
>  
>      msg.client = red_client_ref(client);
> -    dispatcher_send_message(&main_dispatcher.base,
> MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
> +    dispatcher_send_message(&self->base,
> MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
>                              &msg);
>  }
>  
> -void main_dispatcher_set_mm_time_latency(RedClient *client, uint32_t
> latency)
> +void main_dispatcher_set_mm_time_latency(MainDispatcher *self,
> RedClient *client, uint32_t latency)
>  {
>      MainDispatcherMmTimeLatencyMessage msg;
>  
> -    if (pthread_self() == main_dispatcher.base.self) {
> -        reds_set_client_mm_time_latency(reds, client, latency);
> +    if (pthread_self() == self->base.self) {
> +        reds_set_client_mm_time_latency(self->reds, client,
> latency);
>          return;
>      }
>  
>      msg.client = red_client_ref(client);
>      msg.latency = latency;
> -    dispatcher_send_message(&main_dispatcher.base,
> MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
> +    dispatcher_send_message(&self->base,
> MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
>                              &msg);
>  }
>  
> -void main_dispatcher_client_disconnect(RedClient *client)
> +void main_dispatcher_client_disconnect(MainDispatcher *self,
> RedClient *client)
>  {
>      MainDispatcherClientDisconnectMessage msg;
>  
>      if (!client->disconnecting) {
>          spice_debug("client %p", client);
>          msg.client = red_client_ref(client);
> -        dispatcher_send_message(&main_dispatcher.base,
> MAIN_DISPATCHER_CLIENT_DISCONNECT,
> +        dispatcher_send_message(&self->base,
> MAIN_DISPATCHER_CLIENT_DISCONNECT,
>                                  &msg);
>      } else {
>          spice_debug("client %p already during disconnection",
> client);
> @@ -185,9 +190,9 @@ void main_dispatcher_client_disconnect(RedClient
> *client)
>  
>  static void dispatcher_handle_read(int fd, int event, void *opaque)
>  {
> -    Dispatcher *dispatcher = opaque;
> +    MainDispatcher *self = opaque;
>  
> -    dispatcher_handle_recv_read(dispatcher);
> +    dispatcher_handle_recv_read(&self->base);
>  }
>  
>  /*
> @@ -195,23 +200,25 @@ static void dispatcher_handle_read(int fd, int
> event, void *opaque)
>   * Reds routines shouldn't be exposed. Instead reds.c should
> register the callbacks,
>   * and the corresponding operations should be made only via
> main_dispatcher.
>   */
> -void main_dispatcher_init(SpiceCoreInterfaceInternal *core)
> +MainDispatcher* main_dispatcher_new(RedsState *reds,
> SpiceCoreInterfaceInternal *core)
>  {
> -    memset(&main_dispatcher, 0, sizeof(main_dispatcher));
> -    main_dispatcher.core = core;
> -    dispatcher_init(&main_dispatcher.base,
> MAIN_DISPATCHER_NUM_MESSAGES, &main_dispatcher.base);
> -    core->watch_add(core, main_dispatcher.base.recv_fd,
> SPICE_WATCH_EVENT_READ,
> -                    dispatcher_handle_read, &main_dispatcher.base);
> -    dispatcher_register_handler(&main_dispatcher.base,
> MAIN_DISPATCHER_CHANNEL_EVENT,
> +    MainDispatcher *main_dispatcher = g_new0(MainDispatcher, 1);
> +    main_dispatcher->core = core;
> +    main_dispatcher->reds = reds;
> +    dispatcher_init(&main_dispatcher->base,
> MAIN_DISPATCHER_NUM_MESSAGES, main_dispatcher);
> +    core->watch_add(core, main_dispatcher->base.recv_fd,
> SPICE_WATCH_EVENT_READ,
> +                    dispatcher_handle_read, main_dispatcher);
> +    dispatcher_register_handler(&main_dispatcher->base,
> MAIN_DISPATCHER_CHANNEL_EVENT,
>                                  main_dispatcher_handle_channel_event
> ,
>                                  sizeof(MainDispatcherChannelEventMes
> sage), 0 /* no ack */);
> -    dispatcher_register_handler(&main_dispatcher.base,
> MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
> +    dispatcher_register_handler(&main_dispatcher->base,
> MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
>                                  main_dispatcher_handle_migrate_compl
> ete,
>                                  sizeof(MainDispatcherMigrateSeamless
> DstCompleteMessage), 0 /* no ack */);
> -    dispatcher_register_handler(&main_dispatcher.base,
> MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
> +    dispatcher_register_handler(&main_dispatcher->base,
> MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
>                                  main_dispatcher_handle_mm_time_laten
> cy,
>                                  sizeof(MainDispatcherMmTimeLatencyMe
> ssage), 0 /* no ack */);
> -    dispatcher_register_handler(&main_dispatcher.base,
> MAIN_DISPATCHER_CLIENT_DISCONNECT,
> +    dispatcher_register_handler(&main_dispatcher->base,
> MAIN_DISPATCHER_CLIENT_DISCONNECT,
>                                  main_dispatcher_handle_client_discon
> nect,
>                                  sizeof(MainDispatcherClientDisconnec
> tMessage), 0 /* no ack */);
> +    return main_dispatcher;
>  }
> diff --git a/server/main-dispatcher.h b/server/main-dispatcher.h
> index 1a06229..cbc3657 100644
> --- a/server/main-dispatcher.h
> +++ b/server/main-dispatcher.h
> @@ -21,16 +21,18 @@
>  #include <spice.h>
>  #include "red-channel.h"
>  
> -void main_dispatcher_channel_event(int event, SpiceChannelEventInfo
> *info);
> -void main_dispatcher_seamless_migrate_dst_complete(RedClient
> *client);
> -void main_dispatcher_set_mm_time_latency(RedClient *client, uint32_t
> latency);
> +typedef struct MainDispatcher MainDispatcher;
> +
> +void main_dispatcher_channel_event(MainDispatcher *self, int event,
> SpiceChannelEventInfo *info);
> +void main_dispatcher_seamless_migrate_dst_complete(MainDispatcher
> *self, RedClient *client);
> +void main_dispatcher_set_mm_time_latency(MainDispatcher *self,
> RedClient *client, uint32_t latency);
>  /*
>   * Disconnecting the client is always executed asynchronously,
>   * in order to protect from expired references in the routines
>   * that triggered the client destruction.
>   */
> -void main_dispatcher_client_disconnect(RedClient *client);
> +void main_dispatcher_client_disconnect(MainDispatcher *self,
> RedClient *client);
>  
> -void main_dispatcher_init(SpiceCoreInterfaceInternal *core);
> +MainDispatcher* main_dispatcher_new(RedsState *reds,
> SpiceCoreInterfaceInternal *core);
>  
>  #endif //MAIN_DISPATCHER_H
> diff --git a/server/red-channel.c b/server/red-channel.c
> index 757bb6e..d7ff37e 100644
> --- a/server/red-channel.c
> +++ b/server/red-channel.c
> @@ -941,6 +941,7 @@ error:
>  
>  static void
> red_channel_client_seamless_migration_done(RedChannelClient *rcc)
>  {
> +    RedsState *reds = red_channel_get_server(rcc->channel);
>      rcc->wait_migrate_data = FALSE;
>  
>      pthread_mutex_lock(&rcc->client->lock);
> @@ -953,7 +954,8 @@ static void
> red_channel_client_seamless_migration_done(RedChannelClient *rcc)
>          rcc->client->seamless_migrate = FALSE;
>          /* migration completion might have been triggered from a
> different thread
>           * than the main thread */
> -        main_dispatcher_seamless_migrate_dst_complete(rcc->client);
> +        main_dispatcher_seamless_migrate_dst_complete(reds_get_main_
> dispatcher(reds),
> +                                                      rcc->client);
>          if (rcc->latency_monitor.timer) {
>              red_channel_client_start_ping_timer(rcc,
> PING_TEST_IDLE_NET_TIMEOUT_MS);
>          }
> diff --git a/server/reds-private.h b/server/reds-private.h
> index c214091..f567929 100644
> --- a/server/reds-private.h
> +++ b/server/reds-private.h
> @@ -242,6 +242,7 @@ struct RedsState {
>      RedSSLParameters ssl_parameters;
>      SpiceCoreInterfaceInternal *core;
>      GList *dispatchers;
> +    MainDispatcher *main_dispatcher;
>  };
>  
>  #endif
> diff --git a/server/reds-stream.c b/server/reds-stream.c
> index ec720e0..140b767 100644
> --- a/server/reds-stream.c
> +++ b/server/reds-stream.c
> @@ -349,7 +349,9 @@ void reds_stream_free(RedsStream *s)
>  
>  void reds_stream_push_channel_event(RedsStream *s, int event)
>  {
> -    main_dispatcher_channel_event(event, s->priv->info);
> +    RedsState *reds = s->priv->reds;
> +    MainDispatcher *md = reds_get_main_dispatcher(reds);
> +    main_dispatcher_channel_event(md, event, s->priv->info);
>  }
>  
>  static void reds_stream_set_socket(RedsStream *stream, int socket)
> diff --git a/server/reds.c b/server/reds.c
> index 18152f9..dd6ffd9 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -3350,7 +3350,7 @@ static int do_spice_init(RedsState *reds,
> SpiceCoreInterface *core_interface)
>      reds_init_vd_agent_resources(reds);
>      ring_init(&reds->clients);
>      reds->num_clients = 0;
> -    main_dispatcher_init(reds->core);
> +    reds->main_dispatcher = main_dispatcher_new(reds, reds->core);
>      ring_init(&reds->channels);
>      ring_init(&reds->mig_target_clients);
>      ring_init(&reds->char_devs_states);
> @@ -4197,3 +4197,8 @@ uint32_t reds_qxl_ram_size(RedsState *reds)
>      first = reds->dispatchers->data;
>      return red_dispatcher_qxl_ram_size(first);
>  }
> +
> +MainDispatcher* reds_get_main_dispatcher(RedsState *reds)
> +{
> +    return reds->main_dispatcher;
> +}
> diff --git a/server/reds.h b/server/reds.h
> index 686aaac..891a1ea 100644
> --- a/server/reds.h
> +++ b/server/reds.h
> @@ -28,6 +28,7 @@
>  #include "common/messages.h"
>  #include "spice.h"
>  #include "red-channel.h"
> +#include "main-dispatcher.h"
>  #include "migration-protocol.h"
>  
>  typedef struct RedsState RedsState;
> @@ -115,5 +116,6 @@ void reds_update_client_mouse_allowed(RedsState
> *reds);
>  gboolean reds_use_client_monitors_config(RedsState *reds);
>  void reds_client_monitors_config(RedsState *reds,
> VDAgentMonitorsConfig *monitors_config);
>  void reds_set_mm_time(RedsState *reds, uint32_t mm_time);
> +MainDispatcher* reds_get_main_dispatcher(RedsState *reds);
>  
>  #endif
> diff --git a/server/stream.c b/server/stream.c
> index 3120860..2bfb993 100644
> --- a/server/stream.c
> +++ b/server/stream.c
> @@ -683,6 +683,7 @@ static void update_client_playback_delay(void
> *opaque, uint32_t delay_ms)
>  {
>      StreamAgent *agent = opaque;
>      DisplayChannelClient *dcc = agent->dcc;
> +    RedsState *reds = red_channel_get_server(dcc-
> >common.base.channel);
>  
>      dcc_update_streams_max_latency(dcc, agent);
>  
> @@ -691,7 +692,9 @@ static void update_client_playback_delay(void
> *opaque, uint32_t delay_ms)
>          agent->dcc->streams_max_latency = delay_ms;
>      }
>      spice_debug("resetting client latency: %u", agent->dcc-
> >streams_max_latency);
> -    main_dispatcher_set_mm_time_latency(RED_CHANNEL_CLIENT(agent-
> >dcc)->client, agent->dcc->streams_max_latency);
> +    main_dispatcher_set_mm_time_latency(reds_get_main_dispatcher(red
> s),
> +                                        RED_CHANNEL_CLIENT(agent-
> >dcc)->client,
> +                                        agent->dcc-
> >streams_max_latency);
>  }
>  
>  void dcc_create_stream(DisplayChannelClient *dcc, Stream *stream)

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


More information about the Spice-devel mailing list