[Spice-devel] [PATCH spice-gtk 1/2] display: fix palette regression

Christophe Fergeau cfergeau at redhat.com
Thu Oct 3 06:36:52 PDT 2013


On Thu, Oct 03, 2013 at 08:51:15AM -0400, Marc-André Lureau wrote:
> 
> 
> ----- Original Message -----
> > On Thu, Oct 03, 2013 at 01:53:55PM +0200, Marc-André Lureau wrote:
> > > palette_get() used to return a ref, and palette_release() used to
> > > release that ref.
> > > 
> > > Since ed877341, the palette is no longer refcount'ed, since its usage is
> > > exclusively local in common/canvas code.
> > > 
> > > palette_release() shouldn't remove the palette from the cache.
> > 
> > Doesn't this mean we will keep some palettes in the cache forever? If yes,
> > some guarantee that the memory used by these palettes is bounded?
> 
> palette_get() / palette_release() always come in pair

Ah right, looks like we can even go with removal then:

diff --git a/common/canvas_base.c b/common/canvas_base.c
index 2753fae..1fb89d2 100644
--- a/common/canvas_base.c
+++ b/common/canvas_base.c
@@ -942,10 +942,6 @@ static pixman_image_t *canvas_get_bits(CanvasBase
*canvas, 
 
     surface = canvas_bitmap_to_surface(canvas, bitmap, palette,
want_original);
 
-    if (palette && (bitmap->flags & SPICE_BITMAP_FLAGS_PAL_FROM_CACHE)) {
-        canvas->palette_cache->ops->release(canvas->palette_cache,
         palette);
-    }
-
     return surface;
 }
 
diff --git a/common/canvas_base.h b/common/canvas_base.h
index 637cdc1..10b855c 100644
--- a/common/canvas_base.h
+++ b/common/canvas_base.h
@@ -77,8 +77,6 @@ typedef struct {
                 SpicePalette *palette);
     SpicePalette *(*get)(SpicePaletteCache *cache,
                          uint64_t id);
-    void (*release)(SpicePaletteCache *cache,
-                    SpicePalette *palette);
 } SpicePaletteCacheOps;
 
 struct _SpicePaletteCache {

diff --git a/gtk/channel-display.c b/gtk/channel-display.c
index 794f4eb..0a91a5e 100644
--- a/gtk/channel-display.c
+++ b/gtk/channel-display.c
@@ -559,11 +559,6 @@ static void palette_remove(SpicePaletteCache *cache,
uint32
     cache_remove(c->palettes, id);
 }
 
-static void palette_release(SpicePaletteCache *cache, SpicePalette
*palette)
-{
-    palette_remove(cache, palette->unique);
-}
-
 #ifdef SW_CANVAS_CACHE
 static void image_put_lossy(SpiceImageCache *cache, uint64_t id,
                             pixman_image_t *surface)
@@ -625,7 +620,6 @@ static SpiceImageCacheOps image_cache_ops = {
 static SpicePaletteCacheOps palette_cache_ops = {
     .put     = palette_put,
     .get     = palette_get,
-    .release = palette_release,
 };


> And a palette is remove from cache with
> SPICE_MSG_DISPLAY_INVAL_{ALL_}PALETTE

Hopefully canvas_get_bits() and handling of
SPICE_MSG_DISPLAY_INVAL_ALL_PALETTE can't race with each other?

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20131003/10df4572/attachment.pgp>


More information about the Spice-devel mailing list