[Spice-devel] [PATCH spice-server 1/3] Use SPICE_CONTAINEROF to avoid some possible alignment warnings on MIPS

Uri Lublin uril at redhat.com
Tue Jun 18 08:35:41 UTC 2019


On 6/3/19 2:22 PM, Frediano Ziglio wrote:
> This patch came from some experiments using an emulated MIPS machine.
> On such architecture due to not supporting alignment access the
> compiler is more strict about conversion complaining with some
> pointer casts. Use different conversion to avoid these warnings.
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>

Ack.

I'm not sure this patch really "fixes" alignment, especially
when the field is the first one == offset is 0, but it makes
the compiler happy and it's correct

Uri.

> ---
>   server/cache-item.tmpl.c |  3 ++-
>   server/dcc.c             |  4 ++--
>   server/image-cache.c     |  5 +++--
>   server/image-encoders.c  | 26 +++++++++++++-------------
>   server/mjpeg-encoder.c   | 12 ++++++------
>   server/pixmap-cache.c    |  2 +-
>   6 files changed, 27 insertions(+), 25 deletions(-)
> 
> diff --git a/server/cache-item.tmpl.c b/server/cache-item.tmpl.c
> index f119a9ee4..8e18f9b1b 100644
> --- a/server/cache-item.tmpl.c
> +++ b/server/cache-item.tmpl.c
> @@ -89,7 +89,8 @@ static int FUNC_NAME(add)(CHANNELCLIENT *channel_client, uint64_t id, size_t siz
>       channel_client->priv->VAR_NAME(available) -= size;
>       SPICE_VERIFY(SPICE_OFFSETOF(RedCacheItem, u.cache_data.lru_link) == 0);
>       while (channel_client->priv->VAR_NAME(available) < 0) {
> -        RedCacheItem *tail = (RedCacheItem *)ring_get_tail(&channel_client->priv->VAR_NAME(lru));
> +        RedCacheItem *tail = SPICE_CONTAINEROF(ring_get_tail(&channel_client->priv->VAR_NAME(lru)),
> +                                                             RedCacheItem, u.cache_data.lru_link);
>           if (!tail) {
>               channel_client->priv->VAR_NAME(available) += size;
>               g_free(item);
> diff --git a/server/dcc.c b/server/dcc.c
> index acc1ca38c..71d09b77f 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -968,8 +968,8 @@ bool dcc_pixmap_cache_unlocked_add(DisplayChannelClient *dcc, uint64_t id,
>           NewCacheItem **now;
>   
>           SPICE_VERIFY(SPICE_OFFSETOF(NewCacheItem, lru_link) == 0);
> -        if (!(tail = (NewCacheItem *)ring_get_tail(&cache->lru)) ||
> -                                                   tail->sync[dcc->priv->id] == serial) {
> +        if (!(tail = SPICE_CONTAINEROF(ring_get_tail(&cache->lru), NewCacheItem, lru_link)) ||
> +                                                     tail->sync[dcc->priv->id] == serial) {
>               cache->available += size;
>               g_free(item);
>               return FALSE;
> diff --git a/server/image-cache.c b/server/image-cache.c
> index 2ca4d4b67..4881f4d92 100644
> --- a/server/image-cache.c
> +++ b/server/image-cache.c
> @@ -78,7 +78,8 @@ static void image_cache_put(SpiceImageCache *spice_cache, uint64_t id, pixman_im
>   #ifndef IMAGE_CACHE_AGE
>       if (cache->num_items == IMAGE_CACHE_MAX_ITEMS) {
>           SPICE_VERIFY(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
> -        ImageCacheItem *tail = (ImageCacheItem *)ring_get_tail(&cache->lru);
> +        ImageCacheItem *tail =
> +            SPICE_CONTAINEROF(ring_get_tail(&cache->lru), ImageCacheItem, lru_link);
>           spice_assert(tail);
>           image_cache_remove(cache, tail);
>       }
> @@ -133,7 +134,7 @@ void image_cache_reset(ImageCache *cache)
>       ImageCacheItem *item;
>   
>       SPICE_VERIFY(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
> -    while ((item = (ImageCacheItem *)ring_get_head(&cache->lru))) {
> +    while ((item = SPICE_CONTAINEROF(ring_get_head(&cache->lru), ImageCacheItem, lru_link))) {
>           image_cache_remove(cache, item);
>       }
>   #ifdef IMAGE_CACHE_AGE
> diff --git a/server/image-encoders.c b/server/image-encoders.c
> index 306c6dca6..d4d486c36 100644
> --- a/server/image-encoders.c
> +++ b/server/image-encoders.c
> @@ -89,7 +89,7 @@ static void image_encoders_release_glz(ImageEncoders *enc);
>   static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
>   quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
>   {
> -    EncoderData *usr_data = &(((QuicData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, QuicData, usr)->data);
>       va_list ap;
>       char message_buf[ENCODER_MESSAGE_SIZE];
>   
> @@ -104,7 +104,7 @@ quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
>   static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
>   lz_usr_error(LzUsrContext *usr, const char *fmt, ...)
>   {
> -    EncoderData *usr_data = &(((LzData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, LzData, usr)->data);
>       va_list ap;
>       char message_buf[ENCODER_MESSAGE_SIZE];
>   
> @@ -233,25 +233,25 @@ static int encoder_usr_more_space(EncoderData *enc_data, uint8_t **io_ptr)
>   
>   static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int rows_completed)
>   {
> -    EncoderData *usr_data = &(((QuicData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, QuicData, usr)->data);
>       return encoder_usr_more_space(usr_data, (uint8_t **)io_ptr) / sizeof(uint32_t);
>   }
>   
>   static int lz_usr_more_space(LzUsrContext *usr, uint8_t **io_ptr)
>   {
> -    EncoderData *usr_data = &(((LzData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, LzData, usr)->data);
>       return encoder_usr_more_space(usr_data, io_ptr);
>   }
>   
>   static int glz_usr_more_space(GlzEncoderUsrContext *usr, uint8_t **io_ptr)
>   {
> -    EncoderData *usr_data = &(((GlzData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, GlzData, usr)->data);
>       return encoder_usr_more_space(usr_data, io_ptr);
>   }
>   
>   static int jpeg_usr_more_space(JpegEncoderUsrContext *usr, uint8_t **io_ptr)
>   {
> -    EncoderData *usr_data = &(((JpegData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, JpegData, usr)->data);
>       return encoder_usr_more_space(usr_data, io_ptr);
>   }
>   
> @@ -265,7 +265,7 @@ static int lz4_usr_more_space(Lz4EncoderUsrContext *usr, uint8_t **io_ptr)
>   
>   static int zlib_usr_more_space(ZlibEncoderUsrContext *usr, uint8_t **io_ptr)
>   {
> -    EncoderData *usr_data = &(((ZlibData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, ZlibData, usr)->data);
>       return encoder_usr_more_space(usr_data, io_ptr);
>   }
>   
> @@ -301,25 +301,25 @@ static inline int encoder_usr_more_lines(EncoderData *enc_data, uint8_t **lines)
>   
>   static int quic_usr_more_lines(QuicUsrContext *usr, uint8_t **lines)
>   {
> -    EncoderData *usr_data = &(((QuicData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, QuicData, usr)->data);
>       return encoder_usr_more_lines(usr_data, lines);
>   }
>   
>   static int lz_usr_more_lines(LzUsrContext *usr, uint8_t **lines)
>   {
> -    EncoderData *usr_data = &(((LzData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, LzData, usr)->data);
>       return encoder_usr_more_lines(usr_data, lines);
>   }
>   
>   static int glz_usr_more_lines(GlzEncoderUsrContext *usr, uint8_t **lines)
>   {
> -    EncoderData *usr_data = &(((GlzData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, GlzData, usr)->data);
>       return encoder_usr_more_lines(usr_data, lines);
>   }
>   
>   static int jpeg_usr_more_lines(JpegEncoderUsrContext *usr, uint8_t **lines)
>   {
> -    EncoderData *usr_data = &(((JpegData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, JpegData, usr)->data);
>       return encoder_usr_more_lines(usr_data, lines);
>   }
>   
> @@ -333,7 +333,7 @@ static int lz4_usr_more_lines(Lz4EncoderUsrContext *usr, uint8_t **lines)
>   
>   static int zlib_usr_more_input(ZlibEncoderUsrContext *usr, uint8_t** input)
>   {
> -    EncoderData *usr_data = &(((ZlibData *)usr)->data);
> +    EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, ZlibData, usr)->data);
>       int buf_size;
>   
>       if (!usr_data->u.compressed_data.next) {
> @@ -386,7 +386,7 @@ static void image_encoders_init_lz(ImageEncoders *enc)
>   
>   static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *image)
>   {
> -    GlzData *lz_data = (GlzData *)usr;
> +    GlzData *lz_data = SPICE_CONTAINEROF(usr, GlzData, usr);
>       GlzDrawableInstanceItem *glz_drawable_instance = (GlzDrawableInstanceItem *)image;
>       ImageEncoders *drawable_enc = glz_drawable_instance->glz_drawable->encoders;
>       ImageEncoders *this_enc = SPICE_CONTAINEROF(lz_data, ImageEncoders, glz_data);
> diff --git a/server/mjpeg-encoder.c b/server/mjpeg-encoder.c
> index 4a02e7c8b..e629adae4 100644
> --- a/server/mjpeg-encoder.c
> +++ b/server/mjpeg-encoder.c
> @@ -206,7 +206,7 @@ static MJpegVideoBuffer* create_mjpeg_video_buffer(void)
>   
>   static void mjpeg_encoder_destroy(VideoEncoder *video_encoder)
>   {
> -    MJpegEncoder *encoder = (MJpegEncoder*)video_encoder;
> +    MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
>       g_free(encoder->cinfo.dest);
>       jpeg_destroy_compress(&encoder->cinfo);
>       g_free(encoder->row);
> @@ -931,7 +931,7 @@ static int mjpeg_encoder_encode_frame(VideoEncoder *video_encoder,
>                                         gpointer bitmap_opaque,
>                                         VideoBuffer **outbuf)
>   {
> -    MJpegEncoder *encoder = (MJpegEncoder*)video_encoder;
> +    MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
>       MJpegVideoBuffer *buffer = create_mjpeg_video_buffer();
>       if (!buffer) {
>           return VIDEO_ENCODER_FRAME_UNSUPPORTED;
> @@ -1191,7 +1191,7 @@ static void mjpeg_encoder_client_stream_report(VideoEncoder *video_encoder,
>                                                  int32_t end_frame_delay,
>                                                  uint32_t audio_delay)
>   {
> -    MJpegEncoder *encoder = (MJpegEncoder*)video_encoder;
> +    MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
>       MJpegEncoderRateControl *rate_control = &encoder->rate_control;
>       MJpegEncoderClientState *client_state = &rate_control->client_state;
>       uint64_t avg_enc_size = 0;
> @@ -1289,7 +1289,7 @@ static void mjpeg_encoder_client_stream_report(VideoEncoder *video_encoder,
>   
>   static void mjpeg_encoder_notify_server_frame_drop(VideoEncoder *video_encoder)
>   {
> -    MJpegEncoder *encoder = (MJpegEncoder*)video_encoder;
> +    MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
>       encoder->rate_control.server_state.num_frames_dropped++;
>       mjpeg_encoder_process_server_drops(encoder);
>   }
> @@ -1328,14 +1328,14 @@ static void mjpeg_encoder_process_server_drops(MJpegEncoder *encoder)
>   
>   static uint64_t mjpeg_encoder_get_bit_rate(VideoEncoder *video_encoder)
>   {
> -    MJpegEncoder *encoder = (MJpegEncoder*)video_encoder;
> +    MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
>       return encoder->rate_control.byte_rate * 8;
>   }
>   
>   static void mjpeg_encoder_get_stats(VideoEncoder *video_encoder,
>                                       VideoEncoderStats *stats)
>   {
> -    MJpegEncoder *encoder = (MJpegEncoder*)video_encoder;
> +    MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
>       spice_assert(encoder != NULL && stats != NULL);
>       stats->starting_bit_rate = encoder->starting_bit_rate;
>       stats->cur_bit_rate = mjpeg_encoder_get_bit_rate(video_encoder);
> diff --git a/server/pixmap-cache.c b/server/pixmap-cache.c
> index 489fe0bf6..49659ea41 100644
> --- a/server/pixmap-cache.c
> +++ b/server/pixmap-cache.c
> @@ -45,7 +45,7 @@ void pixmap_cache_clear(PixmapCache *cache)
>       }
>   
>       SPICE_VERIFY(SPICE_OFFSETOF(NewCacheItem, lru_link) == 0);
> -    while ((item = (NewCacheItem *)ring_get_head(&cache->lru))) {
> +    while ((item = SPICE_CONTAINEROF(ring_get_head(&cache->lru), NewCacheItem, lru_link))) {
>           ring_remove(&item->lru_link);
>           g_free(item);
>       }
> 



More information about the Spice-devel mailing list