[PATCH v6 2/7] Better encapsulation for image_encoders_compress_glz call

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

 



Do not access too much encoders data.
Slightly different as now if glz is frozen lz compression is used.
Glz is frozen only during migration.

Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx>
---
 server/dcc-encoders.c | 15 +++++++++++++++
 server/dcc.c          | 17 ++++-------------
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
index e53fd24..7a6a87d 100644
--- a/server/dcc-encoders.c
+++ b/server/dcc-encoders.c
@@ -1195,6 +1195,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);
@@ -1245,8 +1256,12 @@ int image_encoders_compress_glz(ImageEncoders *enc,
     o_comp_data->comp_buf_size = zlib_size;
 
     stat_compress_add(&enc->shared_data->zlib_glz_stat, 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 099f5f6..e5c80ad 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -735,19 +735,10 @@ int dcc_compress_image(DisplayChannelClient *dcc,
         success = image_encoders_compress_quic(&dcc->encoders, dest, src, o_comp_data);
         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);
-            }
-            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);
+        if (success) {
+            break;
         }
         goto lz_compress;
 #ifdef USE_LZ4
-- 
2.7.4

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




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