[Spice-devel] [PATCH 04/18] keep dispatcher list in RedsState

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


On Mon, 2016-02-15 at 16:01 +0000, Frediano Ziglio wrote:
> This duplicate the other list which will be removed
> 
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-dispatcher.c | 22 +++++++++-------------
>  server/red-dispatcher.h |  2 +-
>  server/reds-private.h   |  2 +-
>  server/reds.c           | 15 +++++++++++----
>  4 files changed, 22 insertions(+), 19 deletions(-)
> 
> diff --git a/server/red-dispatcher.c b/server/red-dispatcher.c
> index 9ec760f..68423a1 100644
> --- a/server/red-dispatcher.c
> +++ b/server/red-dispatcher.c
> @@ -713,19 +713,6 @@ void red_dispatcher_on_sv_change(void)
>      }
>  }
>  
> -void red_dispatcher_set_mouse_mode(uint32_t mode)
> -{
> -    RedWorkerMessageSetMouseMode payload;
> -    RedDispatcher *now = dispatchers;
> -    while (now) {
> -        payload.mode = mode;
> -        dispatcher_send_message(&now->dispatcher,
> -                                RED_WORKER_MESSAGE_SET_MOUSE_MODE,
> -                                &payload);
> -        now = now->next;
> -    }
> -}
> -
>  void red_dispatcher_on_vm_stop(void)
>  {
>      RedDispatcher *now = dispatchers;
> @@ -1101,3 +1088,12 @@ void
> red_dispatcher_clear_pending(RedDispatcher *red_dispatcher, int
> pending)
>  
>      clear_bit(pending, &red_dispatcher->pending);
>  }
> +
> +void red_dispatcher_set_mouse_mode(RedDispatcher *dispatcher,
> uint32_t mode)
> +{
> +    RedWorkerMessageSetMouseMode payload;
> +    payload.mode = mode;
> +    dispatcher_send_message(&dispatcher->dispatcher,
> +                            RED_WORKER_MESSAGE_SET_MOUSE_MODE,
> +                            &payload);
> +}
> diff --git a/server/red-dispatcher.h b/server/red-dispatcher.h
> index 4aa5854..1c0c218 100644
> --- a/server/red-dispatcher.h
> +++ b/server/red-dispatcher.h
> @@ -28,7 +28,7 @@ void red_dispatcher_init(QXLInstance *qxl);
>  
>  void red_dispatcher_on_ic_change(void);
>  void red_dispatcher_on_sv_change(void);
> -void red_dispatcher_set_mouse_mode(uint32_t mode);
> +void red_dispatcher_set_mouse_mode(RedDispatcher *dispatcher,
> uint32_t mode);
>  void red_dispatcher_on_vm_stop(void);
>  void red_dispatcher_on_vm_start(void);
>  int red_dispatcher_count(void);
> diff --git a/server/reds-private.h b/server/reds-private.h
> index 2272d4c..c214091 100644
> --- a/server/reds-private.h
> +++ b/server/reds-private.h
> @@ -241,7 +241,7 @@ struct RedsState {
>  
>      RedSSLParameters ssl_parameters;
>      SpiceCoreInterfaceInternal *core;
> -
> +    GList *dispatchers;
>  };
>  
>  #endif
> diff --git a/server/reds.c b/server/reds.c
> index 418f89a..3882477 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -556,11 +556,16 @@ int reds_get_mouse_mode(RedsState *reds)
>  
>  static void reds_set_mouse_mode(RedsState *reds, uint32_t mode)
>  {
> +    GList *l;
> +
>      if (reds->mouse_mode == mode) {
>          return;
>      }
>      reds->mouse_mode = mode;
> -    red_dispatcher_set_mouse_mode(reds->mouse_mode);
> +
> +    for (l = reds->dispatchers; l != NULL; l = l->next)
> +        red_dispatcher_set_mouse_mode(l->data, mode);
> +
>      main_channel_push_mouse_mode(reds->main_channel, reds-
> >mouse_mode, reds->is_client_mouse_allowed);
>  }
>  
> @@ -572,9 +577,10 @@ gboolean reds_get_agent_mouse(const RedsState
> *reds)
>  static void reds_update_mouse_mode(RedsState *reds)
>  {
>      int allowed = 0;
> +    int qxl_count = g_list_length(reds->dispatchers);
>  
>      if ((reds->agent_mouse && reds->vdagent) ||
> -        (inputs_channel_has_tablet(reds->inputs_channel))) {
> +        (inputs_channel_has_tablet(reds->inputs_channel) &&
> qxl_count == 1)) {


This part makes me think that this patch is not rebased on git master.
This change, specifically, was introduced by
commit deb6afc325127e7c1df6ff34f9da6ac3218e3a76

>          allowed = reds->dispatcher_allows_client_mouse;
>      }
>      if (allowed == reds->is_client_mouse_allowed) {
> @@ -1668,7 +1674,7 @@ static void reds_handle_main_link(RedsState
> *reds, RedLinkInfo *link)
>      }
>  
>      if (!mig_target) {
> -        main_channel_push_init(mcc, red_dispatcher_count(),
> +        main_channel_push_init(mcc, g_list_length(reds-
> >dispatchers),
>              reds->mouse_mode, reds->is_client_mouse_allowed,
>              reds_get_mm_time() - MM_TIME_DELTA,
>              red_dispatcher_qxl_ram_size());
> @@ -1814,7 +1820,7 @@ void
> reds_on_client_semi_seamless_migrate_complete(RedsState *reds,
> RedClient *c
>      mcc = red_client_get_main(client);
>  
>      // TODO: not doing net test. consider doing it on
> client_migrate_info
> -    main_channel_push_init(mcc, red_dispatcher_count(),
> +    main_channel_push_init(mcc, g_list_length(reds->dispatchers),
>                             reds->mouse_mode, reds-
> >is_client_mouse_allowed,
>                             reds_get_mm_time() - MM_TIME_DELTA,
>                             red_dispatcher_qxl_ram_size());
> @@ -3196,6 +3202,7 @@ SPICE_GNUC_VISIBLE int
> spice_server_add_interface(SpiceServer *s,
>          qxl->st->scanout.drm_dma_buf_fd = -1;
>          qxl->st->qif = SPICE_CONTAINEROF(interface, QXLInterface,
> base);
>          red_dispatcher_init(qxl);
> +        reds->dispatchers = g_list_prepend(reds->dispatchers, qxl-
> >st->dispatcher);
>  
>      } else if (strcmp(interface->type, SPICE_INTERFACE_TABLET) == 0)
> {
>          SpiceTabletInstance *tablet = SPICE_CONTAINEROF(sin,
> SpiceTabletInstance, base);

Patch, per si, looks good.
I'd go for it when rebased on git master.

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


More information about the Spice-devel mailing list