summaryrefslogtreecommitdiff
path: root/atomic
diff options
context:
space:
mode:
Diffstat (limited to 'atomic')
-rw-r--r--atomic/os390/atomic.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/atomic/os390/atomic.c b/atomic/os390/atomic.c
index 3c57668be..1d44ca3d1 100644
--- a/atomic/os390/atomic.c
+++ b/atomic/os390/atomic.c
@@ -118,3 +118,20 @@ apr_uint32_t apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val)
return old;
}
+APR_DECLARE(void*) apr_atomic_xchgptr(volatile void **mem_ptr, void *new_ptr)
+{
+ void *old_ptr;
+
+ old_ptr = *(void **)mem_ptr; /* old is automatically updated on cs failure */
+#if APR_SIZEOF_VOIDP == 4
+ do {
+ } while (__cs1(&old_ptr, mem_ptr, &new_ptr));
+#elif APR_SIZEOF_VOIDP == 8
+ do {
+ } while (__csg(&old_ptr, mem_ptr, &new_ptr));
+#else
+#error APR_SIZEOF_VOIDP value not supported
+#endif /* APR_SIZEOF_VOIDP */
+
+ return old_ptr;
+}