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

Frediano Ziglio fziglio at redhat.com
Mon Jun 3 11:22:12 UTC 2019


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>
---
 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);
     }
-- 
2.20.1



More information about the Spice-devel mailing list