diff options
author | Fujii Hironori <Hironori.Fujii@sony.com> | 2023-01-10 15:12:07 +0900 |
---|---|---|
committer | Fujii Hironori <Hironori.Fujii@sony.com> | 2023-01-11 06:11:28 +0900 |
commit | 2135fd4a49eff16284397982448f1496fa9361ca (patch) | |
tree | 2e230f040bec2b5484adbe788d889148b59f8935 /src/cairo-atomic.c | |
parent | c76a699f6cfd386b134f63515dc6a3c791fdd226 (diff) | |
download | cairo-2135fd4a49eff16284397982448f1496fa9361ca.tar.gz |
sizeof(cairo_atomic_int_t) should be sizeof(int)
`_cairo_status_set_error` was using `_cairo_atomic_int_cmpxchg` to set
a `cairo_status_t` variable by casting a `cairo_status_t*` to
`cairo_atomic_int_t*`. `cairo_atomic_int` has a generic implementation
which is using a mutex. In the implementation, `cairo_atomic_int_t`
was typedef-ed to `cairo_atomic_intptr_t`. In a typical 64bit system,
cairo_atomic_intptr_t is 64bit and cairo_status_t is 32bit,
_cairo_status_set_error didn't work as expected.
Define `cairo_atomic_int_t` as an alias of `int`.
Added an assertion in `_cairo_status_set_error` to ensure
that `*err` has the same size with `cairo_atomic_int_t`.
Fixes cairo/cairo#606
Diffstat (limited to 'src/cairo-atomic.c')
-rw-r--r-- | src/cairo-atomic.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/src/cairo-atomic.c b/src/cairo-atomic.c index 2af50cd38..3c4d51972 100644 --- a/src/cairo-atomic.c +++ b/src/cairo-atomic.c @@ -42,7 +42,7 @@ COMPILE_TIME_ASSERT(sizeof(void*) == sizeof(int) || sizeof(void*) == sizeof(long long)); #else void -_cairo_atomic_int_inc (cairo_atomic_intptr_t *x) +_cairo_atomic_int_inc (cairo_atomic_int_t *x) { CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); *x += 1; @@ -50,7 +50,7 @@ _cairo_atomic_int_inc (cairo_atomic_intptr_t *x) } cairo_bool_t -_cairo_atomic_int_dec_and_test (cairo_atomic_intptr_t *x) +_cairo_atomic_int_dec_and_test (cairo_atomic_int_t *x) { cairo_bool_t ret; @@ -61,10 +61,10 @@ _cairo_atomic_int_dec_and_test (cairo_atomic_intptr_t *x) return ret; } -cairo_atomic_intptr_t -_cairo_atomic_int_cmpxchg_return_old_impl (cairo_atomic_intptr_t *x, cairo_atomic_intptr_t oldv, cairo_atomic_intptr_t newv) +cairo_atomic_int_t +_cairo_atomic_int_cmpxchg_return_old_impl (cairo_atomic_int_t *x, cairo_atomic_int_t oldv, cairo_atomic_int_t newv) { - cairo_atomic_intptr_t ret; + cairo_atomic_int_t ret; CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); ret = *x; @@ -90,10 +90,10 @@ _cairo_atomic_ptr_cmpxchg_return_old_impl (void **x, void *oldv, void *newv) } #ifdef ATOMIC_OP_NEEDS_MEMORY_BARRIER -cairo_atomic_intptr_t -_cairo_atomic_int_get (cairo_atomic_intptr_t *x) +cairo_atomic_int_t +_cairo_atomic_int_get (cairo_atomic_int_t *x) { - cairo_atomic_intptr_t ret; + cairo_atomic_int_t ret; CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); ret = *x; @@ -102,19 +102,31 @@ _cairo_atomic_int_get (cairo_atomic_intptr_t *x) return ret; } -cairo_atomic_intptr_t -_cairo_atomic_int_get_relaxed (cairo_atomic_intptr_t *x) +cairo_atomic_int_t +_cairo_atomic_int_get_relaxed (cairo_atomic_int_t *x) { return _cairo_atomic_int_get (x); } void -_cairo_atomic_int_set_relaxed (cairo_atomic_intptr_t *x, cairo_atomic_intptr_t val) +_cairo_atomic_int_set_relaxed (cairo_atomic_int_t *x, cairo_atomic_int_t val) { CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); *x = val; CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); } + +void* +_cairo_atomic_ptr_get (void **x) +{ + void *ret; + + CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); + ret = *x; + CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); + + return ret; +} #endif #endif |