[Spice-devel] [PATCH spice-server 10/10] red_worker: fail handle_migrate_data instead of aborting when there is an error during restoration of surfaces

Marc-André Lureau marcandre.lureau at gmail.com
Wed May 8 07:45:51 PDT 2013


ack


On Wed, May 8, 2013 at 4:06 PM, Yonit Halperin <yhalperi at redhat.com> wrote:

> ---
>  server/red_worker.c | 36 +++++++++++++++++++++++++-----------
>  1 file changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 247f153..f12d8f8 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -10099,16 +10099,20 @@ static uint64_t
> display_channel_handle_migrate_data_get_serial(
>      return migrate_data->message_serial;
>  }
>
> -static void display_channel_client_restore_surface(DisplayChannelClient
> *dcc, uint32_t surface_id)
> +static int display_channel_client_restore_surface(DisplayChannelClient
> *dcc, uint32_t surface_id)
>  {
>      /* we don't process commands till we receive the migration data, thus,
>       * we should have not sent any surface to the client. */
> -    spice_assert(!dcc->surface_client_created[surface_id]);
> +    if (dcc->surface_client_created[surface_id]) {
> +        spice_warning("surface %u is already marked as client_created",
> surface_id);
> +        return FALSE;
> +    }
>      dcc->surface_client_created[surface_id] = TRUE;
> +    return TRUE;
>  }
>
> -static void
> display_channel_client_restore_surfaces_lossless(DisplayChannelClient *dcc,
> -
> MigrateDisplaySurfacesAtClientLossless *mig_surfaces)
> +static int
> display_channel_client_restore_surfaces_lossless(DisplayChannelClient *dcc,
> +
>  MigrateDisplaySurfacesAtClientLossless *mig_surfaces)
>  {
>      uint32_t i;
>
> @@ -10116,11 +10120,14 @@ static void
> display_channel_client_restore_surfaces_lossless(DisplayChannelClien
>      for (i = 0; i < mig_surfaces->num_surfaces; i++) {
>          uint32_t surface_id = mig_surfaces->surfaces[i].id;
>
> -        display_channel_client_restore_surface(dcc, surface_id);
> +        if (!display_channel_client_restore_surface(dcc, surface_id)) {
> +            return FALSE;
> +        }
>      }
> +    return TRUE;
>  }
>
> -static void
> display_channel_client_restore_surfaces_lossy(DisplayChannelClient *dcc,
> +static int
> display_channel_client_restore_surfaces_lossy(DisplayChannelClient *dcc,
>
>  MigrateDisplaySurfacesAtClientLossy *mig_surfaces)
>  {
>      uint32_t i;
> @@ -10131,7 +10138,9 @@ static void
> display_channel_client_restore_surfaces_lossy(DisplayChannelClient *
>          SpiceMigrateDataRect *mig_lossy_rect;
>          SpiceRect lossy_rect;
>
> -        display_channel_client_restore_surface(dcc, surface_id);
> +        if (!display_channel_client_restore_surface(dcc, surface_id)) {
> +            return FALSE;
> +        }
>          spice_assert(dcc->surface_client_created[surface_id]);
>
>          mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect;
> @@ -10142,6 +10151,7 @@ static void
> display_channel_client_restore_surfaces_lossy(DisplayChannelClient *
>          region_init(&dcc->surface_client_lossy_region[surface_id]);
>          region_add(&dcc->surface_client_lossy_region[surface_id],
> &lossy_rect);
>      }
> +    return TRUE;
>  }
>  static int display_channel_handle_migrate_data(RedChannelClient *rcc,
> uint32_t size,
>                                                 void *message)
> @@ -10151,6 +10161,7 @@ static int
> display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t s
>      DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel,
> DisplayChannel, common.base);
>      DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
>      uint8_t *surfaces;
> +    int surfaces_restored = FALSE;
>      int i;
>
>      spice_debug(NULL);
> @@ -10214,13 +10225,16 @@ static int
> display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t s
>
>      surfaces = (uint8_t *)message + migrate_data->surfaces_at_client_ptr;
>      if (display_channel->enable_jpeg) {
> -        display_channel_client_restore_surfaces_lossy(dcc,
> -            (MigrateDisplaySurfacesAtClientLossy *)surfaces);
> +        surfaces_restored =
> display_channel_client_restore_surfaces_lossy(dcc,
> +                                (MigrateDisplaySurfacesAtClientLossy
> *)surfaces);
>      } else {
> -            display_channel_client_restore_surfaces_lossless(dcc,
> -            (MigrateDisplaySurfacesAtClientLossless*)surfaces);
> +        surfaces_restored =
> display_channel_client_restore_surfaces_lossless(dcc,
> +
>  (MigrateDisplaySurfacesAtClientLossless*)surfaces);
>      }
>
> +    if (!surfaces_restored) {
> +        return FALSE;
> +    }
>      red_channel_client_pipe_add_type(rcc,
> PIPE_ITEM_TYPE_INVAL_PALLET_CACHE);
>      /* enable sending messages */
>      red_channel_client_ack_zero_messages_window(rcc);
> --
> 1.8.1.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>



-- 
Marc-André Lureau
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20130508/a78a3ac6/attachment.html>


More information about the Spice-devel mailing list