[Spice-devel] [PATCH v2 2/2] Add some debugging for GlzDictItem structure
Frediano Ziglio
fziglio at redhat.com
Wed Jun 22 15:19:53 UTC 2016
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/image-encoders.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/server/image-encoders.c b/server/image-encoders.c
index 0ade8c8..c2d7648 100644
--- a/server/image-encoders.c
+++ b/server/image-encoders.c
@@ -20,12 +20,15 @@
#endif
#include <glib.h>
+#include <common/log.h>
#include "image-encoders.h"
#include "spice-bitmap-utils.h"
#include "red-worker.h" // red_drawable_unref
#include "pixmap-cache.h" // MAX_CACHE_CLIENTS
+#define GLZ_DEBUG 0
+
#define ZLIB_DEFAULT_COMPRESSION_LEVEL 3
#define ENCODER_MESSAGE_SIZE 512
@@ -66,6 +69,23 @@ static void encoder_data_init(EncoderData *data);
static void encoder_data_reset(EncoderData *data);
static void image_encoders_release_glz(ImageEncoders *enc);
+#if GLZ_DEBUG
+static void glz_dict_item_check(GlzDictItem *glz_item)
+{
+ spice_assert(glz_item);
+ spice_assert(ring_item_is_linked(&glz_item->glz_context_link));
+ spice_assert(ring_item_is_linked(&glz_item->retention_link));
+ spice_assert(glz_item->enc);
+ spice_assert(glz_item->red_drawable);
+ if (ring_item_is_linked(&glz_item->free_link)) {
+ spice_assert(glz_item->dict_image_context == NULL);
+ }
+}
+#else
+static inline void glz_dict_item_check(GlzDictItem *glz_item)
+{
+}
+#endif
static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
@@ -371,6 +391,7 @@ static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *im
GlzDictItem *glz_item = (GlzDictItem *)image;
ImageEncoders *drawable_enc = glz_item->enc;
ImageEncoders *this_enc = SPICE_CONTAINEROF(lz_data, ImageEncoders, glz_data);
+ glz_dict_item_check(glz_item);
glz_item->dict_image_context = NULL;
if (this_enc == drawable_enc) {
glz_context_free(glz_item);
@@ -386,6 +407,7 @@ static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *im
ring_add_before(&glz_item->free_link,
&drawable_enc->glz_dict_items_to_free);
pthread_mutex_unlock(&drawable_enc->glz_dict_items_to_free_lock);
+ glz_dict_item_check(glz_item);
}
}
@@ -487,7 +509,7 @@ static gboolean glz_context_free(GlzDictItem *glz_item)
{
gboolean ret;
- spice_assert(glz_item);
+ glz_dict_item_check(glz_item);
ring_remove(&glz_item->glz_context_link);
ring_remove(&glz_item->retention_link);
@@ -529,6 +551,7 @@ int image_encoders_free_some_independent_glz_drawables(ImageEncoders *enc, int m
while (max_to_free > n
&& (ring_link = ring_get_head(&enc->glz_orphans)) != NULL) {
GlzDictItem *glz_item = SPICE_CONTAINEROF(ring_link, GlzDictItem, retention_link);
+ glz_dict_item_check(glz_item);
if (glz_context_free(glz_item)) {
++n;
}
@@ -547,6 +570,7 @@ void image_encoders_free_glz_drawables_to_free(ImageEncoders* enc)
pthread_mutex_lock(&enc->glz_dict_items_to_free_lock);
while ((ring_link = ring_get_head(&enc->glz_dict_items_to_free))) {
GlzDictItem * glz_item = SPICE_CONTAINEROF(ring_link, GlzDictItem, free_link);
+ glz_dict_item_check(glz_item);
glz_context_free(glz_item);
}
pthread_mutex_unlock(&enc->glz_dict_items_to_free_lock);
@@ -567,6 +591,7 @@ void image_encoders_free_glz_drawables(ImageEncoders *enc)
pthread_rwlock_wrlock(&glz_dict->encode_lock);
while ((ring_link = ring_get_head(&enc->glz_dict_items))) {
GlzDictItem *glz_item = SPICE_CONTAINEROF(ring_link, GlzDictItem, glz_context_link);
+ glz_dict_item_check(glz_item);
// no need to lock the to_free list, since we assured no other thread is encoding and
// thus not other thread access the to_free list of the channel
glz_context_free(glz_item);
@@ -582,6 +607,7 @@ void glz_retention_destroy(GlzImageRetention *retention)
while ((head = ring_get_head(&retention->ring)) != NULL) {
GlzDictItem *glz_item = SPICE_CONTAINEROF(head, GlzDictItem, retention_link);
+ glz_dict_item_check(glz_item);
ring_remove(head);
ring_add_before(head, &glz_item->enc->glz_orphans);
}
@@ -1094,6 +1120,7 @@ static GlzDictItem *get_glz_context(ImageEncoders *enc, RedDrawable *red_drawabl
ring_add_before(&ret->glz_context_link, &enc->glz_dict_items);
ring_add(&glz_retention->ring, &ret->retention_link);
+ glz_dict_item_check(ret);
return ret;
}
--
2.7.4
More information about the Spice-devel
mailing list