diff options
author | Moonhee Choi <mh0310.choi@samsung.com> | 2018-06-01 17:28:49 +0900 |
---|---|---|
committer | Moonhee Choi <mh0310.choi@samsung.com> | 2018-06-01 17:28:49 +0900 |
commit | 09169e90d07707dd089c2f24644c383ff4630337 (patch) | |
tree | 69af40a004c38c445c4c65195bfab4208fb09bb3 | |
parent | 46d456ce0d57d981b6674b5af68068a6bd0836f7 (diff) | |
download | cairo-accepted/tizen_5.5_unified_mobile_hotfix.tar.gz cairo-accepted/tizen_5.5_unified_mobile_hotfix.tar.bz2 cairo-accepted/tizen_5.5_unified_mobile_hotfix.zip |
[P180523-02901] Fix a crash occurred by thread unsafe issuetizen_5.5.m2_releasesubmit/tizen_5.5_mobile_hotfix/20201026.185103submit/tizen_5.5/20191031.000003submit/tizen_5.0/20181101.000003submit/tizen/20180608.024409submit/tizen/20180604.115621accepted/tizen/unified/20180611.132130accepted/tizen/5.5/unified/mobile/hotfix/20201027.085114accepted/tizen/5.5/unified/20191031.025510accepted/tizen/5.0/unified/20181102.020211tizen_5.5_mobile_hotfixtizen_5.0accepted/tizen_5.5_unified_mobile_hotfixaccepted/tizen_5.0_unified
Change-Id: I78792c2dc09e4c44c51ffedaea5f73de0ee87e4c
Signed-off-by: Moonhee Choi <mh0310.choi@samsung.com>
-rw-r--r-- | src/cairo-image-surface-private.h | 1 | ||||
-rw-r--r-- | src/cairo-image-surface.c | 22 |
2 files changed, 20 insertions, 3 deletions
diff --git a/src/cairo-image-surface-private.h b/src/cairo-image-surface-private.h index 8ca694c5e..9dc7ac51f 100644 --- a/src/cairo-image-surface-private.h +++ b/src/cairo-image-surface-private.h @@ -77,6 +77,7 @@ struct _cairo_image_surface { unsigned owns_data : 1; unsigned transparency : 2; unsigned color : 2; + unsigned shadow_cache_init : 1; }; #define to_image_surface(S) ((cairo_image_surface_t *)(S)) diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index a399a81be..bf8e262f7 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -96,12 +96,15 @@ static cairo_atomic_int_t shadow_caches_ref_count = 0; 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 @@ -140,6 +143,11 @@ _cairo_image_surface_shadow_cache_acquire (void *abstract_surface) 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++; @@ -174,6 +182,11 @@ _cairo_image_surface_get_shadow_cache (void *abstract_surface) 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; } @@ -295,7 +308,7 @@ _cairo_image_surface_init (cairo_image_surface_t *surface, surface->compositor = _cairo_image_spans_compositor_get (); - _cairo_image_shadow_caches_init (); + surface->shadow_cache_init = 0; CAIRO_TRACE_END (__func__); } @@ -1006,7 +1019,10 @@ _cairo_image_surface_finish (void *abstract_surface) 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; |