[Spice-devel] [PATCH spice-server 06/10] reds: disconnect the session when an essential channel is disconnected

Yonit Halperin yhalperi at redhat.com
Wed May 8 07:55:36 PDT 2013


On 05/08/2013 10:46 AM, Marc-André Lureau wrote:
> What is the motivation for doing that? The client could want to save
> bandwidth by closing a display channel, or he might want to disable all
> inputs temporarily.
>
If these channels were already connected, I believe it is better to 
close the client, than having the user don't understand why suddenly the 
display is frozen, or why his keyboard and mouse don't work.
> And also, similarly, do you think the server should enforce that the
> client connect to all the mandatory channels? And how?
>
I'm not sure we should enforce them, but if they were already connected, 
I don't think they should be disconnected independently.
>
> On Wed, May 8, 2013 at 4:06 PM, Yonit Halperin <yhalperi at redhat.com
> <mailto:yhalperi at redhat.com>> wrote:
>
>     ---
>       server/reds.c | 25 +++++++++++++++++++++++++
>       1 file changed, 25 insertions(+)
>
>     diff --git a/server/reds.c b/server/reds.c
>     index f6a1ce9..38923b0 100644
>     --- a/server/reds.c
>     +++ b/server/reds.c
>     @@ -194,12 +194,37 @@ static void
>     reds_stream_push_channel_event(RedsStream *s, int event)
>           main_dispatcher_channel_event(event, s->info);
>       }
>
>     +static const int mandatory_channels[] = {SPICE_CHANNEL_MAIN,
>     SPICE_CHANNEL_DISPLAY, SPICE_CHANNEL_INPUTS};
>     +
>     +static int channel_is_mandatory(int type)
>     +{
>     +    int i;
>     +    for (i = 0 ; i <
>     sizeof(mandatory_channels)/sizeof(mandatory_channels[0]); ++i) {
>     +        if (type == mandatory_channels[i]) {
>     +            return TRUE;
>     +        }
>     +    }
>     +    return FALSE;
>     +}
>     +
>       void reds_handle_channel_event(int event, SpiceChannelEventInfo *info)
>       {
>           if (core->base.minor_version >= 3 && core->channel_event != NULL)
>               core->channel_event(event, info);
>
>           if (event == SPICE_CHANNEL_EVENT_DISCONNECTED) {
>     +        if (channel_is_mandatory(info->type) && reds->main_channel) {
>     +            RedClient *client =
>     main_channel_get_client_by_link_id(reds->main_channel,
>     +
>     info->connection_id);
>     +            /* if client == NULL, it means that main channel has
>     already been disconnected.
>     +             * and since main channel is a mandatory channel,
>     reds_client_disconnect has
>     +             * already been called */
>     +            if (client) {
>     +                spice_debug("client %p: mandatory channel (type %d
>     id %d)"
>     +                            " has disconnected; closing session",
>     client, info->type, info->id);
>     +                reds_client_disconnect(client);
>     +            }
>     +        }
>               free(info);
>           }
>       }
>     --
>     1.8.1.4
>
>     _______________________________________________
>     Spice-devel mailing list
>     Spice-devel at lists.freedesktop.org
>     <mailto:Spice-devel at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
>
>
>
> --
> Marc-André Lureau



More information about the Spice-devel mailing list