[cairo] [PATCH] Do not hold mutexes when calling destructors.

Behdad Esfahbod behdad at behdad.org
Thu May 15 13:32:38 PDT 2008


On Thu, 2008-05-15 at 16:23 -0400, Behdad Esfahbod wrote:
> On Thu, 2008-05-15 at 16:17 -0400, Jeff Muizelaar wrote:
> 
> > You've lost me. Both implementations (mine and krh's) lock when ever
> > they modify the cache...
> 
> Humm, right.  Anyhoo...

I know I thought of a problem before... Here it is.  In your loop:

+    while (solid_surface_cache.size) {
+	cairo_surface_t *surface = solid_surface_cache.cache[solid_surface_cache.size-1].surface;
+	solid_surface_cache.size--;
+
+	/* release the lock to avoid the possibility of a recursive
+	 * deadlock when the scaled font destroy closure gets called */
+	CAIRO_MUTEX_UNLOCK (_cairo_pattern_solid_surface_cache_lock);
+	cairo_surface_destroy (surface);
+	CAIRO_MUTEX_LOCK (_cairo_pattern_solid_surface_cache_lock);
+    }

solid_surface_cache.size is not declared volatile, so compiler is free
to replace that with a simple countdown loop, but since it may be
modified from other threads, you may end up destroying an entry twice.
Or things like that.


-- 
behdad
http://behdad.org/

"Those who would give up Essential Liberty to purchase a little
 Temporary Safety, deserve neither Liberty nor Safety."
        -- Benjamin Franklin, 1759



More information about the cairo mailing list