summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <fziglio@redhat.com>2019-01-23 19:34:50 +0000
committerFrediano Ziglio <fziglio@redhat.com>2019-01-30 13:07:32 +0000
commit3a58f08ca4623bbf1a561e5ddf9bce4cd7566608 (patch)
tree40b2d9f8f775354a55d944366a40ccdf3c0c5644
parent889e6273bfe0b97ff5a5c53beb79e5b7715def7e (diff)
image-encoders: Initialize Zlib lazily
Zlib structure take up more than 1MB and it is rarely used nowadays as it is not much effective. Initialise it only when necessary saving some memory in the normal case. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
-rw-r--r--server/image-encoders.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/server/image-encoders.c b/server/image-encoders.c
index 88073a3e..5a87df31 100644
--- a/server/image-encoders.c
+++ b/server/image-encoders.c
@@ -451,12 +451,6 @@ static void image_encoders_init_zlib(ImageEncoders *enc)
{
enc->zlib_data.usr.more_space = zlib_usr_more_space;
enc->zlib_data.usr.more_input = zlib_usr_more_input;
-
- enc->zlib = zlib_encoder_create(&enc->zlib_data.usr, ZLIB_DEFAULT_COMPRESSION_LEVEL);
-
- if (!enc->zlib) {
- spice_critical("create zlib encoder failed");
- }
}
void image_encoders_init(ImageEncoders *enc, ImageEncoderSharedData *shared_data)
@@ -494,8 +488,10 @@ void image_encoders_free(ImageEncoders *enc)
lz4_encoder_destroy(enc->lz4);
enc->lz4 = NULL;
#endif
- zlib_encoder_destroy(enc->zlib);
- enc->zlib = NULL;
+ if (enc->zlib != NULL) {
+ zlib_encoder_destroy(enc->zlib);
+ enc->zlib = NULL;
+ }
pthread_mutex_destroy(&enc->glz_drawables_inst_to_free_lock);
}
@@ -1261,6 +1257,13 @@ bool image_encoders_compress_glz(ImageEncoders *enc,
if (!enable_zlib_glz_wrap || (glz_size < MIN_GLZ_SIZE_FOR_ZLIB)) {
goto glz;
}
+ if (enc->zlib == NULL) {
+ enc->zlib = zlib_encoder_create(&enc->zlib_data.usr, ZLIB_DEFAULT_COMPRESSION_LEVEL);
+ if (enc->zlib == NULL) {
+ g_warning("creating zlib encoder failed");
+ goto glz;
+ }
+ }
stat_start_time_init(&start_time, &enc->shared_data->zlib_glz_stat);
zlib_data = &enc->zlib_data;