[Spice-devel] [PATCH 12/15] worker: don't use weird RedCompressedBuf nbytes shifting

Frediano Ziglio fziglio at redhat.com
Mon Nov 9 07:27:35 PST 2015


> 
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> ---
>  server/display-channel.h |  3 +--
>  server/red_worker.c      | 18 +++++++++---------
>  2 files changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/server/display-channel.h b/server/display-channel.h
> index 7c62a62..f1f4e3a 100644
> --- a/server/display-channel.h
> +++ b/server/display-channel.h
> @@ -70,10 +70,9 @@
>  #define NUM_STREAMS 50
>  #define NUM_SURFACES 10000
>  
> -#define RED_COMPRESS_BUF_SIZE (1024 * 64)
>  typedef struct RedCompressBuf RedCompressBuf;
>  struct RedCompressBuf {
> -    uint32_t buf[RED_COMPRESS_BUF_SIZE / 4];
> +    uint8_t buf[64 * 1024];
>      RedCompressBuf *next;
>      RedCompressBuf *send_next;
>  };

Note that adding fields before buf could make buf not aligned to 4 bytes
while we want it aligned to 4 bytes. Quic code for portability require it.
On GCC we could force the alignment with an attribute.
Another portable way to make it aligned would be

  union {
    uint8_t bytes[RED_COMPRESS_BUF_SIZE];
    uint32_t words[RED_COMPRESS_BUF_SIZE / 4];
  } buf;

> diff --git a/server/red_worker.c b/server/red_worker.c
> index cf72100..83e0fa0 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -3888,7 +3888,7 @@ static void glz_usr_free(GlzEncoderUsrContext *usr,
> void *ptr)
>      free(ptr);
>  }
>  
> -static inline int encoder_usr_more_space(EncoderData *enc_data, uint32_t
> **io_ptr)
> +static int encoder_usr_more_space(EncoderData *enc_data, uint8_t **io_ptr)
>  {

The declaration suggests io_ptr can be one byte aligned but this is false.
A comment should be enough.

>      RedCompressBuf *buf;
>  
> @@ -3899,31 +3899,31 @@ static inline int encoder_usr_more_space(EncoderData
> *enc_data, uint32_t **io_pt
>      enc_data->bufs_tail = buf;
>      buf->send_next = NULL;
>      *io_ptr = buf->buf;
> -    return sizeof(buf->buf) >> 2;
> +    return sizeof(buf->buf);
>  }
>  

to remove just the shift here we could use G_N_ELEMENTS macro.

>  static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int
>  rows_completed)
>  {
>      EncoderData *usr_data = &(((QuicData *)usr)->data);
> -    return encoder_usr_more_space(usr_data, io_ptr);
> +    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);
> -    return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> +    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);
> -    return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> +    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);
> -    return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> +    return encoder_usr_more_space(usr_data, io_ptr);
>  }
>  
>  #ifdef USE_LZ4
> @@ -3937,7 +3937,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);
> -    return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> +    return encoder_usr_more_space(usr_data, io_ptr);
>  }
>  
>  static inline int encoder_usr_more_lines(EncoderData *enc_data, uint8_t
>  **lines)
> @@ -4591,8 +4591,8 @@ static inline int
> red_quic_compress_image(DisplayChannelClient *dcc, SpiceImage
>          stride = -src->stride;
>      }
>      size = quic_encode(quic, type, src->x, src->y, NULL, 0, stride,
> -                       quic_data->data.bufs_head->buf,
> -                       sizeof(quic_data->data.bufs_head->buf) >> 2);
> +                       (uint32_t*)quic_data->data.bufs_head->buf,
> +                       sizeof(quic_data->data.bufs_head->buf) /
> sizeof(uint32_t));
>  

Here G_N_ELEMENTS could be used. With the union it would became

   size = quic_encode(quic, type, src->x, src->y, NULL, 0, stride,
                      quic_data->data.bufs_head->buf.words,
                      G_N_ELEMENTS(quic_data->data.bufs_head->buf.words);


>      // the compressed buffer is bigger than the original data
>      if ((size << 2) > (src->y * src->stride)) {
> --
> 2.4.3
> 

Beside the alignment I think other stuff are just style so very
personal opinions.

I won't suggest some definitive code, let's see other comments.

Frediano


More information about the Spice-devel mailing list