[Spice-devel] [PATCH v2] Wait to send monitor config until agent caps are received

Marc-André Lureau mlureau at redhat.com
Thu Aug 28 13:47:10 PDT 2014


ack

----- Original Message -----
> When the first display is disabled and the vdagent is restarted in the guest,
> it sometimes becomes enabled. This appears to be caused by a race condition
> when an agent becomes connected. When the agent becomes connected,
> virt-viewer
> triggers a display update (spice_main_send_monitor_config()). This display
> update happens in a timeout handler, but the timeout interval is set to 0 (so
> it behaves basically like an idle handler).
> 
> The race happens because spice_main_send_monitor_config() behaves slightly
> differently depending on the agent's capabilities. And sometimes the idle
> handler runs before the client and server have negotiated capabilities. In
> this
> case, we have to assume that the server does not support sparse monitor
> configurations. So instead of sending down an update where display #0 is off
> and display #1 is WxH, we send down an update that only a single display:
> display #0 is WxH. This results in the first display becoming enabled.
> 
> To solve the issue, we wait until the agent negotiates capabilities
> before sending the display configuration message.
> 
> Resolves: rhbz#1043782, rhbz#1032923
> ---
> 
> Same as previous patch, but removed the fallback 5s timeout on Marc-Andre's
> suggestion.
> 
>  gtk/channel-main.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/gtk/channel-main.c b/gtk/channel-main.c
> index 7a299a4..905fdb5 100644
> --- a/gtk/channel-main.c
> +++ b/gtk/channel-main.c
> @@ -1508,7 +1508,6 @@ static void main_handle_mouse_mode(SpiceChannel
> *channel, SpiceMsgIn *in)
>  static void main_handle_agent_connected(SpiceChannel *channel, SpiceMsgIn
>  *in)
>  {
>      agent_start(SPICE_MAIN_CHANNEL(channel));
> -    update_display_timer(SPICE_MAIN_CHANNEL(channel), 0);
>  }
>  
>  /* coroutine context */
> @@ -1519,7 +1518,6 @@ static void
> main_handle_agent_connected_tokens(SpiceChannel *channel, SpiceMsgIn
>  
>      c->agent_tokens = msg->num_tokens;
>      agent_start(SPICE_MAIN_CHANNEL(channel));
> -    update_display_timer(SPICE_MAIN_CHANNEL(channel), 0);
>  }
>  
>  /* coroutine context */
> @@ -1790,6 +1788,7 @@ static void main_agent_handle_msg(SpiceChannel
> *channel,
>          }
>          c->agent_caps_received = true;
>          g_coroutine_signal_emit(self, signals[SPICE_MAIN_AGENT_UPDATE], 0);
> +        update_display_timer(SPICE_MAIN_CHANNEL(channel), 0);
>  
>          if (caps->request)
>              agent_announce_caps(self);
> --
> 1.9.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list