diff options
author | Wan-Teh Chang <wtc@google.com> | 2016-03-01 17:48:55 -0800 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2016-03-05 14:35:17 +0100 |
commit | 3538ac3e68f997d95d76865247717c90ae73630d (patch) | |
tree | 26b5a9f0fa70f78dd1d4aa07311cf89bbc2c40ba /src/cairo-freed-pool.c | |
parent | af42fc724e794aeb3b26eb0e8df453a5abd5c640 (diff) | |
download | cairo-3538ac3e68f997d95d76865247717c90ae73630d.tar.gz |
Fix data race in freed_pool
This adds _cairo_atomic_int_get_relaxed and _cairo_atomic_int_set_relaxed which
are meant to have a behaviour of relaxed read/writes in C11's memory model. This
patch also uses these new function to fix a data race with freed_pool_t's |top|
data member.
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=90318
Signed-off-by: Wan-Teh Chang <wtc@google.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
Diffstat (limited to 'src/cairo-freed-pool.c')
-rw-r--r-- | src/cairo-freed-pool.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/cairo-freed-pool.c b/src/cairo-freed-pool.c index cfdc8e96b..5b1c4c0bb 100644 --- a/src/cairo-freed-pool.c +++ b/src/cairo-freed-pool.c @@ -50,13 +50,13 @@ _freed_pool_get_search (freed_pool_t *pool) for (i = ARRAY_LENGTH (pool->pool); i--;) { ptr = _atomic_fetch (&pool->pool[i]); if (ptr != NULL) { - pool->top = i; + _cairo_atomic_int_set_relaxed (&pool->top, i); return ptr; } } /* empty */ - pool->top = 0; + _cairo_atomic_int_set_relaxed (&pool->top, 0); return NULL; } @@ -67,13 +67,13 @@ _freed_pool_put_search (freed_pool_t *pool, void *ptr) for (i = 0; i < ARRAY_LENGTH (pool->pool); i++) { if (_atomic_store (&pool->pool[i], ptr)) { - pool->top = i + 1; + _cairo_atomic_int_set_relaxed (&pool->top, i + 1); return; } } /* full */ - pool->top = i; + _cairo_atomic_int_set_relaxed (&pool->top, i); free (ptr); } @@ -87,7 +87,7 @@ _freed_pool_reset (freed_pool_t *pool) pool->pool[i] = NULL; } - pool->top = 0; + _cairo_atomic_int_set_relaxed (&pool->top, 0); } #endif |