From 52dfa038b9e0c106aa3f9f08abeb7f53e72a762a Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 1 May 2012 15:06:46 +0100 Subject: [PATCH] snapshot: Avoid triggering assertion for grabbing the target during destroy If the source wins the race to acquire the original surface as it is being destroyed, it triggers an assertion. Signed-off-by: Chris Wilson --- src/cairo-surface-inline.h | 8 ++++++++ src/cairo-surface-snapshot-inline.h | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/cairo-surface-inline.h b/src/cairo-surface-inline.h index 1b257d5c3..27ea8f0ec 100644 --- a/src/cairo-surface-inline.h +++ b/src/cairo-surface-inline.h @@ -49,4 +49,12 @@ _cairo_surface_flush (cairo_surface_t *surface) return status; } +static inline cairo_surface_t * +_cairo_surface_reference (cairo_surface_t *surface) +{ + if (!CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + _cairo_reference_count_inc (&surface->ref_count); + return surface; +} + #endif /* CAIRO_SURFACE_INLINE_H */ diff --git a/src/cairo-surface-snapshot-inline.h b/src/cairo-surface-snapshot-inline.h index 7c15b81a7..bf89c772b 100644 --- a/src/cairo-surface-snapshot-inline.h +++ b/src/cairo-surface-snapshot-inline.h @@ -37,6 +37,7 @@ #define CAIRO_SURFACE_SNAPSHOT_INLINE_H #include "cairo-surface-snapshot-private.h" +#include "cairo-surface-inline.h" static inline cairo_bool_t _cairo_surface_snapshot_is_reused (cairo_surface_t *surface) @@ -51,7 +52,7 @@ _cairo_surface_snapshot_get_target (cairo_surface_t *surface) cairo_surface_t *target; CAIRO_MUTEX_LOCK (snapshot->mutex); - target = cairo_surface_reference (snapshot->target); + target = _cairo_surface_reference (snapshot->target); CAIRO_MUTEX_UNLOCK (snapshot->mutex); return target;