summaryrefslogtreecommitdiff
path: root/atomic/unix/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'atomic/unix/builtins.c')
-rw-r--r--atomic/unix/builtins.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/atomic/unix/builtins.c b/atomic/unix/builtins.c
index 6aaae1ba2..b92e435cf 100644
--- a/atomic/unix/builtins.c
+++ b/atomic/unix/builtins.c
@@ -111,7 +111,8 @@ APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint
#endif
}
-APR_DECLARE(void*) apr_atomic_casptr(volatile void **mem, void *ptr, const void *cmp)
+static APR_INLINE
+void *do_casptr(void *volatile *mem, void *ptr, const void *cmp)
{
#if HAVE__ATOMIC_BUILTINS
__atomic_compare_exchange_n(mem, (void *)&cmp, ptr, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
@@ -121,7 +122,18 @@ APR_DECLARE(void*) apr_atomic_casptr(volatile void **mem, void *ptr, const void
#endif
}
-APR_DECLARE(void*) apr_atomic_xchgptr(volatile void **mem, void *ptr)
+APR_DECLARE(void*) apr_atomic_casptr(volatile void **mem, void *ptr, const void *cmp)
+{
+ return do_casptr((void *)mem, ptr, cmp);
+}
+
+APR_DECLARE(void*) apr_atomic_casptr2(void *volatile *mem, void *ptr, const void *cmp)
+{
+ return do_casptr(mem, ptr, cmp);
+}
+
+static APR_INLINE
+void *do_xchgptr(void *volatile *mem, void *ptr)
{
#if HAVE__ATOMIC_BUILTINS
return (void *)__atomic_exchange_n(mem, ptr, __ATOMIC_SEQ_CST);
@@ -131,4 +143,14 @@ APR_DECLARE(void*) apr_atomic_xchgptr(volatile void **mem, void *ptr)
#endif
}
+APR_DECLARE(void*) apr_atomic_xchgptr(volatile void **mem, void *ptr)
+{
+ return do_xchgptr((void *)mem, ptr);
+}
+
+APR_DECLARE(void*) apr_atomic_xchgptr2(void *volatile *mem, void *ptr)
+{
+ return do_xchgptr(mem, ptr);
+}
+
#endif /* USE_ATOMICS_BUILTINS */