static void
_cairo_image_shadow_caches_init (void)
{
+ CAIRO_RECURSIVE_MUTEX_INIT (shadow_caches_mutex);
+ CAIRO_MUTEX_LOCK (shadow_caches_mutex);
+
_cairo_atomic_int_inc (&shadow_caches_ref_count);
if (shadow_caches_ref_count == 1)
cairo_list_init (&shadow_caches);
- CAIRO_RECURSIVE_MUTEX_INIT (shadow_caches_mutex);
+ CAIRO_MUTEX_UNLOCK (shadow_caches_mutex);
}
static void
if (unlikely (surface->base.status))
return surface->base.status;
+ if (!surface->shadow_cache_init) {
+ _cairo_image_shadow_caches_init();
+ surface->shadow_cache_init = 1;
+ }
+
CAIRO_MUTEX_LOCK (shadow_caches_mutex);
shadow_caches_mutex_depth++;
if (unlikely (surface->base.status))
return NULL;
+ if (!surface->shadow_cache_init) {
+ _cairo_image_shadow_caches_init();
+ surface->shadow_cache_init = 1;
+ }
+
return &shadow_caches;
}
surface->compositor = _cairo_image_spans_compositor_get ();
- _cairo_image_shadow_caches_init ();
+ surface->shadow_cache_init = 0;
CAIRO_TRACE_END (__func__);
}
cairo_surface_destroy (parent);
}
- _cairo_image_shadow_caches_destroy ();
+ if (surface->shadow_cache_init) {
+ _cairo_image_shadow_caches_destroy ();
+ surface->shadow_cache_init = 0;
+ }
CAIRO_TRACE_END (__func__);
return CAIRO_STATUS_SUCCESS;