summaryrefslogtreecommitdiff
path: root/src/cairo-freed-pool.c
diff options
context:
space:
mode:
authorWan-Teh Chang <wtc@google.com>2016-03-01 17:48:55 -0800
committerUli Schlachter <psychon@znc.in>2016-03-05 14:35:17 +0100
commit3538ac3e68f997d95d76865247717c90ae73630d (patch)
tree26b5a9f0fa70f78dd1d4aa07311cf89bbc2c40ba /src/cairo-freed-pool.c
parentaf42fc724e794aeb3b26eb0e8df453a5abd5c640 (diff)
downloadcairo-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.c10
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