[Spice-devel] [PATCH v2 23/30] Better encapsulation for dcc_compress_image_glz call
Frediano Ziglio
fziglio at redhat.com
Thu Jun 9 12:31:43 UTC 2016
Do not access too much encoders data.
Slightly different as now if glz is frozen lz compression is used.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/dcc-encoders.c | 15 +++++++++++++++
server/dcc.c | 21 ++++++---------------
2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
index fbe9661..b3643bd 100644
--- a/server/dcc-encoders.c
+++ b/server/dcc-encoders.c
@@ -1193,6 +1193,17 @@ int image_encoders_compress_glz(ImageEncoders *enc,
spice_info("LZ global compress fmt=%d", src->format);
#endif
+ if ((src->x * src->y) >= glz_enc_dictionary_get_size(enc->glz_dict->dict)) {
+ return FALSE;
+ }
+
+ pthread_rwlock_rdlock(&enc->glz_dict->encode_lock);
+ /* using the global dictionary only if it is not frozen */
+ if (enc->glz_dict->migrate_freeze) {
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+ return FALSE;
+ }
+
encoder_data_init(&glz_data->data);
glz_drawable = get_glz_drawable(enc, drawable);
@@ -1243,8 +1254,12 @@ int image_encoders_compress_glz(ImageEncoders *enc,
o_comp_data->comp_buf_size = zlib_size;
stat_compress_add(zlib_glz_stats, start_time, glz_size, zlib_size);
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
return TRUE;
+
glz:
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+
dest->descriptor.type = SPICE_IMAGE_TYPE_GLZ_RGB;
dest->u.lz_rgb.data_size = glz_size;
diff --git a/server/dcc.c b/server/dcc.c
index c906265..1994962 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -743,21 +743,12 @@ int dcc_compress_image(DisplayChannelClient *dcc,
&display_channel->quic_stat);
break;
case SPICE_IMAGE_COMPRESSION_GLZ:
- if ((src->x * src->y) < glz_enc_dictionary_get_size(dcc->encoders.glz_dict->dict)) {
- int frozen;
- /* using the global dictionary only if it is not frozen */
- pthread_rwlock_rdlock(&dcc->encoders.glz_dict->encode_lock);
- frozen = dcc->encoders.glz_dict->migrate_freeze;
- if (!frozen) {
- success = image_encoders_compress_glz(&dcc->encoders, dest, src, drawable, o_comp_data,
- display_channel->enable_zlib_glz_wrap,
- &display_channel->glz_stat,
- &display_channel->zlib_glz_stat);
- }
- pthread_rwlock_unlock(&dcc->encoders.glz_dict->encode_lock);
- if (!frozen) {
- break;
- }
+ success = image_encoders_compress_glz(&dcc->encoders, dest, src, drawable, o_comp_data,
+ display_channel->enable_zlib_glz_wrap,
+ &display_channel->glz_stat,
+ &display_channel->zlib_glz_stat);
+ if (success) {
+ break;
}
goto lz_compress;
#ifdef USE_LZ4
--
2.7.4
More information about the Spice-devel
mailing list