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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>

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


_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]